web-dev-qa-db-fra.com

Comment définir l'attribut layout_weight dynamiquement à partir du code?

Comment définir la valeur de l'attribut layout_weight pour le bouton dans Android de manière dynamique à partir de code Java?

203
Adham

Vous pouvez le transmettre dans le cadre du constructeur LinearLayout.LayoutParams:

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.

394
Erich Douglass

Utilisez 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!

109
kcoppock

Si vous définissez déjà votre vue dans votre fichier de présentation (xml), 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, tels que les marges, ou vous devez tous les spécifier dans LayoutParams.

76
pkliang

Si le constructeur avec largeur, hauteur et poids ne fonctionne pas, essayez d'utiliser le constructeur avec largeur et hauteur. Et puis définissez 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);
childParam1.weight = 0.7f;
child2.setLayoutParams(childParam2);

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

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.

14
ash1103

N'importe lequel de LinearLayout.LayoutParams et TableLayout.LayoutParams a fonctionné pour moi, pour les boutons le droit est TableRow.LayoutParams. C'est:

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

À propos de l'utilisation de MATCH_PARENT ou WRAP_CONTENT soit identique.

6
gantzer89

Si vous avez déjà défini votre vue dans un fichier layout (xml) et que vous souhaitez uniquement modifier le poids de manière grammaticale, la création de 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);

3
Shirish Herwade

Si layoutparams est déjà défini (en XML ou de manière dynamique), voici une ligne:

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

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

Dans 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