Comment puis-je définir la valeur de l'attribut layout_weight
pour le bouton dans Android dynamiquement à partir du code Java?
Comment puis-je définir la valeur de l'attribut layout_weight
pour le bouton dans Android dynamiquement à partir du code Java?
Réponses:
Vous pouvez le transmettre en tant que partie du LinearLayout.LayoutParams
constructeur:
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT,
1.0f
);
YOUR_VIEW.setLayoutParams(param);
Le dernier paramètre est le poids.
param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
1f
s'il n'y a pas de décimales
Relative
Utilisation 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 réponse d'Erich est plus facile!
FILL_PARENT
a été déconseillé et MATCH_PARENT
doit être utilisé à la place.
MATCH_PARENT
peut être utilisé au lieu de FILL_PARENT
même sur des appareils plus anciens.
FILL_PARENT
contre MATCH_PARENT
.
Si vous définissez déjà votre vue dans votre fichier de mise en page (xml), que vous souhaitez uniquement modifier le poids par programmation, cette méthode est préférable
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);
new a LayoutParams écrase les autres paramètres définis dans votre fichier xml comme les marges, ou vous devez tous les spécifier dans LayoutParams.
Si le constructeur avec largeur, hauteur et poids ne fonctionne pas, essayez d'utiliser le constructeur avec largeur et hauteur. Et puis réglez manuellement le poids.
Et si vous souhaitez que la largeur soit définie en fonction du poids, définissez la largeur sur 0 dans le constructeur. Il en va de même pour la hauteur. Le code ci-dessous fonctionne pour moi.
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);
Si je cherche une réponse, utilisez ceci:
LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;
Si vous initialisez votre mise en page à partir d'un fichier xml, cela sera beaucoup plus pratique que de fournir de nouveaux paramètres de mise en page pour la mise en page linéaire.
layout_weight
a déjà été présentée, vous devez appeler View.requestLayout()
pour mettre à jour.
N'importe lequel LinearLayout.LayoutParams
et a TableLayout.LayoutParams
fonctionné pour moi, pour les boutons, le bon est TableRow.LayoutParams
. C'est:
TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
TableRow.LayoutParams.MATCH_PARENT,
TableRow.LayoutParams.WRAP_CONTENT, 1f);
À propos de l'utilisation MATCH_PARENT
ou de WRAP_CONTENT
la même chose.
FILL_PARENT
a été déconseillé et MATCH_PARENT
doit être utilisé à la place.
LayoutParams
parent direct. Je suppose que vous avez eu un plantage à essayer d'utiliser LinearLayout.LayoutParams
sans le parent LinearLayout
.
Si vous avez déjà défini votre vue dans le fichier de mise en page (xml) et que vous souhaitez uniquement modifier le poids de manière grammaticale, la création de nouveaux LayoutParams écrase les autres paramètres définis dans votre fichier xml.
Donc, vous devez d'abord utiliser "getLayoutParams" puis setLayoutParams
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams();
params.weight = 4f;
mButton.setLayoutParams(params);
Si layoutparams
est déjà défini (en XML ou dynamiquement), voici une ligne:
((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
En utilisant Kotlin, vous pouvez faire quelque chose comme:
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)
}
}