Wie setze ich das Attribut layout_weight dynamisch aus Code?

244

Wie kann ich den Wert für das Attribut layout_weightfür die Schaltfläche in Android dynamisch aus Java-Code festlegen ?

Adham
quelle
Es wird dieser Frage / Antwort sehr ähnlich sein: stackoverflow.com/questions/4638832/… und diese: stackoverflow.com/questions/4637233/…
Rich Schuler
Wenn Sie die Ansicht bereits in der Layoutdatei (XML) definiert haben, werden beim Erstellen neuer LayoutParams andere in der XML-Datei definierte Parameter überschrieben. Also sollten Sie zuerst "getLayoutParams" verwenden. Siehe vollständige Antwort stackoverflow.com/questions/4641072/…
Shirish Herwade

Antworten:

461

Sie können es als Teil des LinearLayout.LayoutParamsKonstruktors übergeben:

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

Der letzte Parameter ist das Gewicht.

Erich Douglass
quelle
2
Es sollte seinparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan
49
Wenn Sie nicht von einem Double zu einem Float werfen möchten, setzen Sie einfach 1.0f
Xample
8
Oder noch einfacher ausgedrückt, 1fwenn es keine Dezimalstellen gibt
Sandalone
4
Was tun, wenn das übergeordnete Layout lautet Relative
?
9
@pratik Wenn das übergeordnete Layout relativ ist, verwenden Sie keine Gewichte
invertigo
121

Verwendung 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, Erichs Antwort ist einfacher!

Kevin Coppock
quelle
27
Erichs Anser ist vielleicht leichter zu schreiben, aber dein Anser ist leichter zu lesen. Da steht, für welches Attribut 1.0f verwendet wird.
Johan
3
Sie haben festgestellt, dass Sie das Gewicht im laufenden Betrieb ändern können, indem Sie 'view.getLayoutParams ()' aufrufen und dann den Wert ändern.
RobGThai
1
FILL_PARENTwurde veraltet und MATCH_PARENTsollte stattdessen verwendet werden.
Simon Forsberg
2
@LocalPCGuy Nicht wahr. Solange Sie auf SDK> = 8 abzielen (was Sie unbedingt sein sollten), MATCH_PARENTkann es anstelle von FILL_PARENTsogar auf älteren Geräten verwendet werden.
Kevin Coppock
2
@LocalPCGuy Niemand verwendet mehr API 7 oder weniger . Wenn Sie versuchen , Ihre Anwendung kompatibel mit APIs 7 oder weniger zu machen, würden Sie wahrscheinlich in eine ganze Menge anderer Probleme laufen , bevor sich Gedanken darüber FILL_PARENTvs. MATCH_PARENT.
Simon Forsberg
82

Wenn Sie Ihre Ansicht bereits in Ihrer Layoutdatei (XML) definiert haben und das Gewicht nur programmgesteuert ändern möchten, ist dies besser

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

new a LayoutParams überschreibt andere in Ihrer XML-Datei definierte Parameter wie Ränder, oder Sie müssen alle in LayoutParams angeben.

pkliang
quelle
2
Mit "params.weight = 1f;" Sie legen bereits das Gewicht für das LayoutParams-Objekt fest. Es ist nicht erforderlich, "mButton.setLayoutParams (params);" aufzurufen.
MrMaffen
2
Nein, Sie müssen setLayoutParams
SIr Codealot
1
Dies ist tatsächlich die eleganteste Antwort und ändert direkt ein bestimmtes UI-Objekt. Die beste Antwort ist auch gut und älter als dieser Beitrag. Es verdient also die beste Antwort. Ich habe diesen Beitrag allerdings positiv bewertet.
Das Original Android
Tolle und einfache Lösung!
Jeremy
Klappt wunderbar! Vielen Dank :)
Vinay Vissh
26

Wenn der Konstruktor mit Breite, Höhe und Gewicht nicht funktioniert, versuchen Sie, den Konstruktor mit Breite und Höhe zu verwenden. Und dann das Gewicht manuell einstellen.

Wenn Sie möchten, dass die Breite entsprechend dem Gewicht festgelegt wird, setzen Sie die Breite im Konstruktor auf 0. Gleiches gilt für die Höhe. Der folgende Code funktioniert für mich.

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);
Ganindu
quelle
Genau das, was ich brauchte! Alle reden hier über das Einstellen von Gewichten, niemand hat angezeigt, was passiert, wenn diese gewogenen Kinder zur Elternansicht hinzugefügt werden! Ich habe tatsächlich gesucht, wie man weightSum in die ParentView einfügt! Vielen Dank!
Sud007
14

Wenn ich jemanden suche, der eine Antwort sucht, benutze dies:

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

Wenn Sie Ihr Layout aus einer XML-Datei initialisieren, ist dies viel praktischer als die Bereitstellung neuer Layoutparameter für das lineare Layout.

Asche
quelle
Dies sollte die akzeptierte Antwort sein, da keine zuvor festgelegten Variablen wie Breite / Höhe / Rand / Polsterung usw. geändert werden. Alles wird beibehalten und wiederverwendet, während das Gewicht geändert wird.
MrMaffen
1
Wenn die einzustellende Ansicht layout_weightbereits angelegt wurde, müssen Sie View.requestLayout()zum Aktualisieren aufrufen .
Attacktive
6

Jeder von LinearLayout.LayoutParamsund TableLayout.LayoutParamsarbeitete für mich, für Knöpfe ist der richtige TableRow.LayoutParams. Das ist:

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

Über die Verwendung MATCH_PARENToder WRAP_CONTENTgleich sein.

gantzer89
quelle
3
FILL_PARENTwurde veraltet und MATCH_PARENTsollte stattdessen verwendet werden.
Simon Forsberg
Ich denke, LayoutParams.MATCH_PARENT sollte auf 0 geändert werden.
CoolMind
Sie rufen das LayoutParamsdes direkten Elternteils an. Ich gehe davon aus, dass Sie einen Absturz hatten, bei dem versucht wurde, ihn LinearLayout.LayoutParamsohne die Eltern zu verwenden LinearLayout.
Verlassener Wagen
4

Wenn Sie Ihre Ansicht bereits in der Layoutdatei (XML) definiert haben und das Gewicht nur grammatikalisch ändern möchten, werden beim Erstellen neuer LayoutParams andere in Ihrer XML-Datei definierte Parameter überschrieben.

Sie sollten also zuerst "getLayoutParams" und dann setLayoutParams verwenden

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

Shirish Herwade
quelle
3

Wenn layoutparamsbereits definiert (in XML oder dynamisch), ist hier ein Einzeiler:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
SolidSnake
quelle
Unterschätzte Antwort
Adam Higgins
0

Mit Kotlin können Sie Folgendes tun:

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)
    }
}
Hasan A Yousef
quelle