Android definir altura e largura da exibição personalizada programaticamente


128

Eu criei uma exibição personalizada chamada Graphview . Aqui está a estrutura para a classe GraphView.

public class GraphView extends View {

    public GraphView(Context context, float[] values, String title, String[] horlabels, String[] verlabels, boolean type) {
        super(context);
                ........
   }

   ..................
   .................
}

Eu adicionei a exibição em uma tabela usando addview(). Está funcionando bem. Agora eu quero definir altura e largura para o GraphView. Como fazer isso?

Respostas:


140

A maneira mais fácil é definir o tamanho programaticamente assim:

graphView.setLayoutParams(new LayoutParams(width, height));

Isso é bom se você souber o tamanho exato da exibição. No entanto, se você quiser uma abordagem mais flexível, poderá substituir o onMeasure()método para medir a visualização com mais precisão, dependendo do espaço disponível e das restrições de layout ( wrap_content,match_parent , ou um tamanho fixo).

Você pode encontrar um exemplo de como substituir onMeasure(), consultando os documentos do Android e a LabelViewamostra no diretório do SDK.


16
Seria útil saber quais LayoutParams você está importando para lá.
user3690202

1
O LayoutParamsdeve ser do layout em que o local graphViewé colocado. Por exemplo, se no arquivo de layout XML graphViewé colocado dentro RelativeLayout, então você deve usarnew RelativeLayout.LayoutParams(width, height)
Vic

208

Você pode definir altura e largura da seguinte forma:

myGraphView.setLayoutParams(new LayoutParams(width, height));

76
Você deve certificar-se de que a classe LayoutParam que você usa seja da classe Layout correta pai. Por exemplo, se o seu GraphView estiver contido em um LinearLayout, você precisará usar a classe LinearLayout.LayoutParams.
Yincrash

41
Isso também funciona e garante que você use a classe LayoutParams correta: simplesmente faça myGraphView.getLayoutParams().height = 100;.
sulai 23/10/12

21
Se o fizer this.getLayoutParams().height = 100, certifique-se de segui-lo this.setLayoutParams(this.getLayoutParams()), caso contrário ele não fará nada (útil).
Achal Dave

4
Acho estranho que essa resposta esteja ganhando mais pontos. Embora seja mais fácil, é muito menos modular; se você quiser usar sua visualização em um local diferente, também precisará codificar esses valores de largura / altura. Tenha cuidado ao usar isso.
Gardarh

1
Obrigado @yincrash por apontar isso. Parece estranho que eu precise usar a classe pai view '(RelativeLayout no meu caso) em vez da classe pai do meu modo de exibição personalizado (SurfaceView no meu caso)
#

75

você pode definir a altura e a largura de uma vista em um layout relativo como este

ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 130;
view.setLayoutParams(params);

2
você não precisa definir o layoutparam novamente. É refletido automaticamente. Essa é a vantagem da abordagem orientada a objetos.
Dipendra

8
@Dipendra a chamada para setLayoutParams()é necessária porque invoca outros métodos, como resolveLayoutParams()erequestLayout()
William

dando excepção como em onCreate getLayoutParams () é nula value.So params.height causa excepção
Sibasish

Você deve consultar a vista para a qual você deve definir a altura. Verifique se você está apontando para o mesmo ponto de vista
Rakshi

1
Obter a layoutParamsiniciação de uma exibição será um NPE, por favor, explique em que momento você executa isso?
John Sardinha

6

No Kotlin, você pode definir a largura e a altura de qualquer visualização diretamente usando suas propriedades virtuais:

someView.layoutParams.width = 100
someView.layoutParams.height = 200

4
spin12.setLayoutParams(new LinearLayout.LayoutParams(200, 120));

spin12é o seu spinner e 200 , 120 é widthe heightpara o seu spinner.


3

Esta é uma versão baseada em Kotlin, assumindo que a visualização principal seja uma instância de LinearLayout.

someView.layoutParams = LinearLayout.LayoutParams(100, 200)

Isso permite definir a largura e a altura ( 100e 200) em uma única linha.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.