wake-up-neo.com

Wie kann man das layout_weight-Attribut dynamisch aus dem Code setzen?

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

203
Adham

Sie können es als Teil des LinearLayout.LayoutParams-Konstruktors ü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.

394
Erich Douglass

Verwenden Sie 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!

109
kcoppock

Wenn Sie Ihre Ansicht bereits in Ihrer Layoutdatei (XML-Datei) definieren und die Gewichtung nur programmgesteuert ändern möchten, ist dieser Weg besser

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

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

76
pkliang

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, legen Sie im Konstruktor die Breite auf 0 fest. 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);
childParam1.weight = 0.7f;
child2.setLayoutParams(childParam2);

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

Wenn ich jemanden suche, der nach einer Antwort sucht, benutze diese: 

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

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

14
ash1103

Jeder von LinearLayout.LayoutParams und TableLayout.LayoutParams hat für mich funktioniert, für Knöpfe ist TableRow.LayoutParams die richtige. Das ist:

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

Die Verwendung von MATCH_PARENT oder WRAP_CONTENT ist gleich.

6
gantzer89

Wenn Sie Ihre Ansicht bereits in der Layoutdatei (XML-Datei) definiert haben und nur die Gewichtung pro grammatisch ä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);

3
Shirish Herwade

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

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

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

In Koltin

        val params = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, 2.0f)

        params.weight = 1.0f
        button.layoutParams = params
0
Leo Paim