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

245

Comment puis-je définir la valeur de l'attribut layout_weightpour le bouton dans Android dynamiquement à partir du code Java?

Adham
la source
Ce sera très similaire à cette question / réponse: stackoverflow.com/questions/4638832/… et celle-ci: stackoverflow.com/questions/4637233/…
Rich Schuler
Si vous avez déjà défini la vue dans le fichier de mise en page (xml), la création de nouveaux LayoutParams remplace les autres paramètres définis dans le fichier xml. Donc, vous devez d'abord utiliser "getLayoutParams". Voir la réponse complète stackoverflow.com/questions/4641072/…
Shirish Herwade

Réponses:

463

Vous pouvez le transmettre en tant que partie du LinearLayout.LayoutParamsconstructeur:

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.

Erich Douglass
la source
2
Ça devrait êtreparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan
49
Si vous ne voulez pas passer d'un double à un flotteur, mettez simplement 1.0f
Xample
8
Ou encore plus simple 1fs'il n'y a pas de décimales
sandalone
4
que faire si la disposition parent estRelative
Pratik Butani
9
@pratik si la disposition parent est relative, vous n'utilisez pas de poids
invertigo
121

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!

Kevin Coppock
la source
27
Le Anser d'Erich est peut-être plus facile à écrire, mais le vôtre est plus facile à lire. Puisqu'il indique pour quel attribut le 1.0f est utilisé.
Johan
3
le vôtre a établi que vous pouvez modifier le poids à la volée en appelant «view.getLayoutParams ()», puis modifiez la valeur.
RobGThai
1
FILL_PARENTa été déconseillé et MATCH_PARENTdoit être utilisé à la place.
Simon Forsberg
2
@LocalPCGuy Pas vrai. Tant que vous ciblez SDK> = 8 (ce que vous devriez absolument être), MATCH_PARENTpeut être utilisé au lieu de FILL_PARENTmême sur des appareils plus anciens.
Kevin Coppock
2
@LocalPCGuy Personne n'utilise plus l'API 7 ou moins . Si vous essayez de rendre votre application compatible avec les API 7 ou moins, vous auriez probablement courir dans beaucoup d'autres problèmes avant de se soucier FILL_PARENTcontre MATCH_PARENT.
Simon Forsberg
82

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.

pkliang
la source
2
Avec "params.weight = 1f;" vous définissez déjà le poids sur l'objet LayoutParams. Il n'est pas nécessaire d'appeler "mButton.setLayoutParams (params);".
MrMaffen
2
Non, vous devez appeler setLayoutParams
SIr Codealot
1
C'est en fait la réponse la plus élégante et elle change directement un objet d'interface utilisateur spécifique. La meilleure réponse est aussi bonne et plus ancienne que ce post. Il mérite donc la meilleure réponse. J'ai cependant voté pour cet article.
L'Android d'origine
Grande et simple solution!
Jeremy
Fonctionne comme un charme! Merci beaucoup :)
Vinay Vissh
26

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);
Ganindu
la source
Juste ce dont j'avais besoin! Tout le monde parle de régler les poids ici, personne n'a montré ce qui se passe lorsque ces enfants pesés sont ajoutés à la vue des parents! Je cherchais réellement comment ajouter weightSum sur le ParentView! Merci!
sud007
14

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.

cendre
la source
Cela devrait être la réponse acceptée car elle ne modifie aucune variable précédemment définie comme la largeur / hauteur / marge / rembourrage, etc. Tout est conservé et réutilisé pendant que le poids est modifié.
MrMaffen
1
Si la vue à définir layout_weighta déjà été présentée, vous devez appeler View.requestLayout()pour mettre à jour.
Attacktive
6

N'importe lequel LinearLayout.LayoutParamset a TableLayout.LayoutParamsfonctionné 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_PARENTou de WRAP_CONTENTla même chose.

gantzer89
la source
3
FILL_PARENTa été déconseillé et MATCH_PARENTdoit être utilisé à la place.
Simon Forsberg
Je pense que LayoutParams.MATCH_PARENT devrait être changé en 0.
CoolMind
Vous appelez le LayoutParamsparent direct. Je suppose que vous avez eu un plantage à essayer d'utiliser LinearLayout.LayoutParamssans le parent LinearLayout.
Panier abandonné le
4

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);

Shirish Herwade
la source
3

Si layoutparamsest déjà défini (en XML ou dynamiquement), voici une ligne:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;
SolidSnake
la source
Réponse sous-estimée
Adam Higgins
0

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