Imposta il peso del layout di un TextView a livello di codice


214

Sto cercando di creare dinamicamente TableRowoggetti e aggiungerli a un file TableLayout. Gli TableRowoggetti hanno 2 elementi, a TextViewe a CheckBox. Gli TextViewelementi devono avere il peso del layout impostato su 1 per spingere gli CheckBoxelementi all'estrema destra.

Non riesco a trovare documentazione su come impostare a livello di codice il peso del layout di un TextViewelemento.

Risposte:


356

Devi usare TableLayout.LayoutParamscon qualcosa del genere:

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

L'ultimo parametro è il peso.


15
Non ne ho parlato prima, quindi mi dispiace. Ma ho provato questo prima di porre la mia domanda. Fa scomparire TextView dal layout. Ma, con una nota positiva, ho scoperto che l'impostazione della proprietà stretch_columns del TableLayout su 0 provoca l'effetto che sto cercando (TextView a sinistra, CheckBoxes a destra). Grazie per l'aiuto.
eugene

8
Se stai importando un layout XML e non stai creando il tuo layout dinamicamente, puoi prenderlo in questo modo: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

6
Per impostare il peso del layout a livello di codice, è TableRow.LayoutParamsnecessario utilizzare al posto di TableLayout.LayoutParams. Vedi la risposta di @ Dorje.
Halil

import android.widget.LinearLayout; import android.widget.TableLayout;
Prakash

1
Nota che la maggior parte delle persone userebbe 0 come primo o secondo parametro (a seconda se orizzontale o verticale) e non WRAP_CONTENT poiché quello che stanno cercando è impostare il peso.
FlorianB

97

La risposta è che devi usare TableRow.LayoutParams, non LinearLayout.LayoutParams o qualsiasi altro LayoutParams.

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

I diversi LayoutParams non sono intercambiabili e se usi quello sbagliato sembra che non succeda nulla. Il genitore della vista di testo è una riga di tabella, quindi:

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


Questa risposta mi ha aiutato molto ... TableLayout non ha funzionato per me
sham

Oh amico, mi hai risparmiato così tanto tempo. Dove è specificato? Non ho trovato nulla nella documentazione su di te che non puoi scambiareLayoutParams
Adrien Cadet

TableRow.LayoutParamsha fatto il lavoro anche per me
Menelaos Kotsollaris

6
La parte fondamentale di questa risposta è lo 0
Leon

Ridurrà il mio tempo di lavoro, lo cerco da molto tempo. Ottima soluzione
SIVAKUMAR.J

38

Nelle risposte precedenti il peso viene passato al costruttore di un nuovo oggetto SomeLayoutType.LayoutParams. Tuttavia in molti casi è più conveniente utilizzare oggetti esistenti: aiuta a evitare di trattare parametri che non ci interessano.

Un esempio:

// 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);

loparams potrebbe essere NULL, quindi assicurati di controllarlo prima di chiamare setLayoutParams ()
AAgg

@AAgg, non in una situazione pratica. La vista non si sarebbe gonfiata se non fosse stata impostata la larghezza e l'altezza. Ma sono d'accordo: è una buona pratica controllare quando ci sono dubbi su null.
sberezin

16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f è denota come peso = 1; puoi dare 2f o 3f, le viste si sposteranno in base allo spazio


12

imposta semplicemente i parametri di layout in quel layout come

crea la variabile param

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

1f è il peso variabile

imposta il tuo widget o layout come

 TextView text = (TextView) findViewById(R.id.text);
 text.setLayoutParams(params);

da dove prendi questa informazione che 1f indica la variabile di peso? Puoi fornire un link per favore?
hayonj

@hayonj controlla solo i sorgenti del LinearLayout.LayoutParamscostruttore. Il terzo parametro è il peso. O documentazione
mente

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

(O)

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

1f è indicato come peso = 1; a seconda delle tue necessità puoi dare 2f o 3f, le viste si sposteranno in base allo spazio. Per creare una distanza specificata tra le viste nel layout lineare, utilizzare weightsum per "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);

8

Questo dovrebbe funzionare per te

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

param.weight=1.0f;

7

Puoi anche dare peso separatamente in questo modo,

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

 lp1.weight=1;

6

Questo funziona per me, e spero che funzioni anche per te

Impostare prima i LayoutParams per la visualizzazione padre:

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

quindi impostato per TextView (figlio):

 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); 

1

C'è un altro modo per farlo. Nel caso in cui sia necessario impostare un solo parametro, ad esempio "altezza":

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

1

Dopo aver lottato per 4 ore. Infine, questo codice ha funzionato per me.

Ci sono 3 colonne in una riga.

  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));

-1

Ho avuto un bel po 'di difficoltà con una soluzione molto simile a questa: provare ad avere due pulsanti in un TableRow, ciascuno con la metà della larghezza dello schermo. Per qualsiasi motivo, il pulsante sinistro sarà sempre circa il 70% della larghezza e il pulsante destro il 30%. La chiamata a table_layout.setStretchAllColumns (true) non ha avuto alcun effetto, né l'impostazione della larghezza del pulsante a metà dello schermo, né l'impostazione del loro peso di layout.

La soluzione che ho ottenuto è stata l'annidamento di un LinearLayout nelle TableRows, che ha tenuto conto del valore della larghezza dei pulsanti.

    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;
        }

1
Solo così sai per il futuro, la soluzione è impostare TableRow, Button1 e Button2 in modo che tutti abbiano layout_width=fill_parent, e dopo averlo fatto, impostare layout_weight=1sia per button1 che per button2. A tutti gli elementi con fill_parent e layout_weight = 1 verrà assegnata una dimensione uguale al momento dell'inflazione.
ed il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.