Come impostare l'attributo layout_weight in modo dinamico dal codice?


245

Come posso impostare il valore dell'attributo layout_weightper button in android in modo dinamico dal codice java?


Sarà molto simile a questa domanda / risposta: stackoverflow.com/questions/4638832/… e questo: stackoverflow.com/questions/4637233/…
Rich Schuler

Se hai già definito la vista nel file di layout (xml), la creazione di nuovi LayoutParams sovrascrive altri parametri definiti nel file xml. Quindi prima dovresti usare "getLayoutParams". Vedi risposta completa stackoverflow.com/questions/4641072/...
Shirish Herwade

Risposte:


463

Puoi passarlo come parte del LinearLayout.LayoutParamscostruttore:

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

L'ultimo parametro è il peso.


2
Dovrebbe essereparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan,

49
Se non vuoi lanciare da un doppio a un float, metti 1.0f
Xample

8
O ancora più semplice 1fse non ci sono posizioni decimali
sandalone,

4
cosa fare se il layout del genitore èRelative
Pratik Butani,

9
@pratik se il layout del genitore è relativo non si usano pesi
invertigo

121

Utilizzare LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);

EDIT: Ah, la risposta di Erich è più facile!


27
La risposta di Erich potrebbe essere più facile da scrivere, ma la tua è più facile da leggere. Dato che dice per quale attributo è usato 1.0f.
Johan

3
il tuo ha stabilito che puoi modificare il peso al volo chiamando 'view.getLayoutParams ()' quindi modificare il valore.
RobGThai,

1
FILL_PARENTè stato deprecato e MATCH_PARENTdeve essere utilizzato invece.
Simon Forsberg,

2
@LocalPCGuy Non è vero. Fintanto che si sceglie come target SDK> = 8 (cosa che si dovrebbe assolutamente essere), MATCH_PARENTpuò essere utilizzato anziché FILL_PARENTanche su dispositivi meno recenti.
Kevin Coppock,

2
@LocalPCGuy Nessuno usa più API 7 o meno . Se si sta cercando di rendere il vostro app compatibili con le API 7 o meno, si sarebbe probabilmente esegue in un sacco di altri problemi prima di preoccuparsi FILL_PARENTvs. MATCH_PARENT.
Simon Forsberg,

82

Se hai già definito la tua vista nel tuo file di layout (xml), vuoi solo cambiare il peso a livello di codice, in questo modo è meglio

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

nuovo a LayoutParams sovrascrive altri parametri definiti nel file XML come i margini, oppure è necessario specificarli tutti in LayoutParams.


2
Con "params.weight = 1f;" stai già impostando il peso sull'oggetto LayoutParams. Non è necessario chiamare "mButton.setLayoutParams (params);".
MrMaffen,

2
No, devi chiamare setLayoutParams
Codealot il

1
Questa è in realtà la risposta più elegante e cambia direttamente un oggetto UI specifico. Anche la migliore risposta è buona e più vecchia di questo post. Quindi merita la migliore risposta. Ho votato a fondo questo post.
L'originale Android

Ottima e semplice soluzione!
Jeremy,

Funziona come un fascino! Grazie mille :)
Vinay Vissh

26

Se il costruttore con larghezza, altezza e peso non funziona, provare a utilizzare il costruttore con larghezza e altezza. E quindi impostare manualmente il peso.

E se vuoi che la larghezza sia impostata in base al peso, imposta la larghezza come 0 nel costruttore. Lo stesso vale per l'altezza. Di seguito il codice funziona per me.

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);

Proprio quello di cui avevo bisogno! Tutti parlano qui di impostare i pesi, nessuno ha mostrato cosa succede quando quei Bambini pesati vengono aggiunti alla Vista genitori! In realtà stavo cercando come aggiungere peso su ParentView! Grazie!
sud007,

14

Se qualcuno cerca una risposta, usa questo:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

Se stai inizializzando il tuo layout dal file xml, questo sarà molto più conveniente che fornire nuovi parametri di layout per il layout lineare.


Questa dovrebbe essere la risposta accettata in quanto non modifica alcuna variabile precedentemente impostata come larghezza / altezza / margine / imbottitura ecc. Tutto viene mantenuto e riutilizzato mentre il peso viene modificato.
MrMaffen,

1
Se la vista da impostare layout_weightè già stata predisposta, è necessario chiamare View.requestLayout()per l'aggiornamento.
Attacco del

6

Qualsiasi LinearLayout.LayoutParamse ha TableLayout.LayoutParamsfunzionato per me, per i pulsanti quello giusto è TableRow.LayoutParams. Questo è:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

Informazioni sull'uso MATCH_PARENTo WRAP_CONTENTlo stesso.


3
FILL_PARENTè stato deprecato e MATCH_PARENTdeve essere utilizzato invece.
Simon Forsberg,

Penso che LayoutParams.MATCH_PARENT dovrebbe essere cambiato in 0.
CoolMind

Chiama il LayoutParamsgenitore diretto. Presumo che tu abbia avuto un arresto nel tentativo di utilizzare LinearLayout.LayoutParamssenza il genitore LinearLayout.
Carrello abbandonato il

4

Se hai già definito la tua vista nel file di layout (xml) e vuoi solo modificare il peso in modo grammaticale, quindi la creazione di nuovi LayoutParams sovrascrive altri parametri definiti nel tuo file xml.

Quindi prima dovresti usare "getLayoutParams" e poi setLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

Se layoutparamsè già definito (in XML o in modo dinamico), ecco una riga:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

Risposta sottovalutata
Adam Higgins,

0

Usando Kotlin puoi fare qualcosa del tipo:

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView {
    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {


        val parent = LinearLayout(context)

        parent.apply {
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply {
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
                    }
                })
                addView(ImageButton(context).apply({
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply {
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    }
                }))
            }
        }
        this.addView(parent)
    }
}
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.