Wie kann ich den Wert für das Attribut layout_weight
für die Schaltfläche in Android dynamisch aus Java-Code festlegen ?
Wie kann ich den Wert für das Attribut layout_weight
für die Schaltfläche in Android dynamisch aus Java-Code festlegen ?
Antworten:
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.
param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
1f
wenn es keine Dezimalstellen gibt
Relative
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!
FILL_PARENT
wurde veraltet und MATCH_PARENT
sollte stattdessen verwendet werden.
MATCH_PARENT
kann es anstelle von FILL_PARENT
sogar auf älteren Geräten verwendet werden.
FILL_PARENT
vs. MATCH_PARENT
.
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.
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);
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.
layout_weight
bereits angelegt wurde, müssen Sie View.requestLayout()
zum Aktualisieren aufrufen .
Jeder von LinearLayout.LayoutParams
und TableLayout.LayoutParams
arbeitete 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_PARENT
oder WRAP_CONTENT
gleich sein.
FILL_PARENT
wurde veraltet und MATCH_PARENT
sollte stattdessen verwendet werden.
LayoutParams
des direkten Elternteils an. Ich gehe davon aus, dass Sie einen Absturz hatten, bei dem versucht wurde, ihn LinearLayout.LayoutParams
ohne die Eltern zu verwenden LinearLayout
.
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);
Wenn layoutparams
bereits definiert (in XML oder dynamisch), ist hier ein Einzeiler:
((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
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)
}
}