Definir o peso do layout de um TextView programaticamente

214

Estou tentando criar TableRowobjetos dinamicamente e adicioná-los a um TableLayout. Os TableRowobjetos têm 2 itens, a TextViewe a CheckBox. Os TextViewitens precisam ter seu peso de layout definido como 1 para empurrá- CheckBoxlos para a extrema direita.

Não consigo encontrar documentação sobre como definir programaticamente o peso do layout de um TextViewitem.

eugene
fonte

Respostas:

355

Você precisa usar TableLayout.LayoutParamsalgo assim:

TextView tv = new TextView(v.getContext());
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

O último parâmetro é o peso.

Macarse
fonte
15
Eu não mencionei isso antes, então me desculpe. Mas eu tentei isso antes de fazer minha pergunta. Faz o TextView desaparecer do layout. Mas, em uma nota positiva, descobri que definir a propriedade stretch_columns do TableLayout como 0 causa o efeito que estou procurando (o TextView está à esquerda, as CheckBoxes à direita). Obrigado pela ajuda.
Eugene
8
Se você estiver importando um layout XML e você não está criando seu dinamicamente layout, você pode agarrá-lo assim:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Eric Leschinski
5
Para definir o peso do layout programaticamente, TableRow.LayoutParamsdeve ser usado em vez de TableLayout.LayoutParams. Veja a resposta de @ Dorje.
Halil
importar android.widget.LinearLayout; importar android.widget.TableLayout;
Prakash
1
Observe que a maioria das pessoas usaria 0 como primeiro ou segundo parâmetro (dependendo se horizontal ou vertical) e não WRAP_CONTENT, pois o que eles procuram é definir o peso.
FlorianB 14/11/16
97

A resposta é que você precisa usar TableRow.LayoutParams, não LinearLayout.LayoutParams ou qualquer outro LayoutParams.

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

Os diferentes LayoutParams não são intercambiáveis ​​e, se você usar o errado, nada parece acontecer. O pai da exibição de texto é uma linha da tabela, portanto:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html

Dorje
fonte
Essa resposta me ajudou muito ... TableLayout não funcionou para mim
sham.y
Ah cara, você me salvou muito tempo. Onde é especificado? Não encontrei nada na documentação sobre você não pode trocarLayoutParams
Adrien Cadet
TableRow.LayoutParamsfez o trabalho para mim também
Menelau Kotsollaris
6
A parte chave desta resposta é o 0
Leon
Ele irá reduzir meu trabalho time.Im busca para isso há uma grande solução a longo time.Very
SIVAKUMAR.J
38

Nas respostas anteriores, o peso é passado para o construtor de um novo objeto SomeLayoutType.LayoutParams. Ainda em muitos casos, é mais conveniente usar objetos existentes - isso ajuda a evitar lidar com parâmetros nos quais não estamos interessados.

Um exemplo:

// Get our View (TextView or anything) object:
View v = findViewById(R.id.our_view); 

// Get params:
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams();

// Set only target params:
loparams.height = 0;
loparams.weight = 1;
v.setLayoutParams(loparams);
sberezin
fonte
loparams poderia ser NULL isso certifique-se verificar que antes de chamar setLayoutParams ()
AAGG
@ AgAg, não em uma situação prática. A vista não teria inflado se não tivesse largura e altura definidas. Mas eu concordo - é uma boa prática verificar quando há dúvidas sobre nulo.
Sberezin
16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f é denotado como peso = 1; você pode dar 2f ou 3f, as visualizações serão movidas de acordo com o espaço


fonte
12

basta definir parâmetros de layout nesse layout, como

criar variável param

 android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);

1f é variável de peso

defina seu widget ou layout como

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);
Manikandan
fonte
onde você obtém essa informação que 1f significa a variável de peso? Você pode fornecer um link, por favor?
hayonj
@hayonj basta verificar as fontes do LinearLayout.LayoutParamsconstrutor. O terceiro parâmetro é peso. Ou documentação
mente
11
TextView text = new TextView(v.getContext());
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                                LayoutParams.WRAP_CONTENT, 1f));

(OU)

TextView tv = new TextView(v.getContext());
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
tv.setLayoutParams(params);

1f é referido como peso = 1; de acordo com sua necessidade, você pode fornecer 2f ou 3f, as visualizações serão movidas de acordo com o espaço. Para determinar a distância especificada entre as vistas no layout Linear, use a soma de pesos para "LinearLayout".

LinearLayout ll_Outer= (LinearLayout ) view.findViewById(R.id.linearview);
LinearLayout llInner = new LinearLayout(this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
            llInner.Orientation = Orientation.Horizontal;
            llInner.WeightSum = 2;
            ll_Outer.AddView(llInner);
anand krish
fonte
8

Isso deve funcionar para você

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParams.MATCH_PARENT);

param.weight=1.0f;
Ashok Reddy M
fonte
7

Você também pode dar peso separadamente assim,

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);

 lp1.weight=1;
Kiran Boghra
fonte
6

Este trabalho para mim, e espero que funcione para você também

Defina os LayoutParams para a visualização principal primeiro:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT,
                TableLayout.LayoutParams.FILL_PARENT));

defina para o TextView (filho):

 TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams
     (TableLayout.LayoutParams.WRAP_CONTENT,
     TableLayout.LayoutParams.WRAP_CONTENT,1f);
     //-- set components margins
     textViewParam.setMargins(5, 0, 5,0);
     myTextView.setLayoutParams(textViewParam); 
Najem1234
fonte
1

Existe outra maneira de fazer isso. Caso você precise definir apenas um parâmetro, por exemplo 'height':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
fonte
1

Depois de lutar por 4 horas. Finalmente, este código funcionou para mim.

3 colunas existem em uma linha.

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
Gulshan Yadav
fonte
-1

Eu tive bastante dificuldade com uma solução, algo muito parecido com isso: tentar ter dois botões em um TableRow, cada um com metade da largura da tela. Por qualquer motivo, o botão esquerdo sempre terá cerca de 70% da largura e o botão direito 30%. Chamar table_layout.setStretchAllColumns (true) não teve efeito, nem definiu a largura do botão para metade da tela, nem definiu o peso do layout.

A solução que eu acabei com foi aninhar um LinearLayout nas TableRows, que se levem em conta o valor da largura dos botões.

    TableLayout layout = new TableLayout(this);
    TableRow top_row = new TableRow(this);
    left_button = styleButton();
    right_button = styleButton();
    LinearLayout toprow_layout = new LinearLayout (this);
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL);
    toprow_layout.addView (left_button);
    toprow_layout.addView(right_button);
    toprow.addView(top_layout);
    layout.addView(top_row)

    private Button styleButton() {
            Button btn = new Button (this);
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();      
            btn.setWidth((int)(display.getWidth()/2));    // set width to half
            btn.setHeight(((int)display.getHeight()/6));  // set height to whatevs
            btn.setText("foo");
            return btn;
        }
joseph_morris
fonte
1
Para que você saiba no futuro, a solução é configurar TableRow, Button1 e Button2 para que todos tenham layout_width=fill_parent, e depois disso, defina o layout_weight=1botão1 e o button2. Todos os elementos com fill_parent e um layout_weight = 1 terão um tamanho igual após a inflação.
Edthethird