web-dev-qa-db-fra.com

Définir des marges dans un LinearLayout par programme

J'essaie d'utiliser Java (pas XML) pour créer un LinearLayout avec des boutons qui remplissent l'écran et ont des marges. Voici un code qui fonctionne sans marges:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r) {
    Button btn = new Button(this);
    btn.setText("A");

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); // Verbose!
    lp.weight = 1.0f; // This is critical. Doesn't work without it.
    buttonsView.addView(btn, lp);
}

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);

Cela fonctionne donc bien, mais comment pouvez-vous laisser les marges des boutons de manière à laisser un espace entre eux? J'ai essayé d'utiliser LinearLayout.MarginLayoutParams, mais il n'y a pas de membre weight alors ce n'est pas bon. Et ça ne marche pas si vous passez lp dans son constructeur non plus.

Est-ce impossible? Parce que cela a vraiment l'air, et que ce ne serait pas la première tâche de mise en page Android que vous ne pouvez faire qu'en XML.

258
Timmmm

Voici un petit code pour le réaliser:

LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

layoutParams.setMargins(30, 20, 30, 0);

Button okButton=new Button(this);
okButton.setText("some text");
ll.addView(okButton, layoutParams);
483
Mauro

Cela fonctionne donc bien, mais comment pouvez-vous laisser les marges des boutons de manière à laisser un espace entre eux?

Vous appelez setMargins() sur l'objet LinearLayout.LayoutParams.

J'ai essayé d'utiliser LinearLayout.MarginLayoutParams, mais comme il n'y a pas d'élément de poids, ce n'est pas bon.

LinearLayout.LayoutParams est une sous-classe de LinearLayout.MarginLayoutParams, comme indiqué dans la documentation .

Est-ce impossible?

Non.

ce ne serait pas la première tâche de mise en page Android que vous ne pouvez effectuer qu'en XML

Vous êtes invités à fournir une preuve de cette réclamation.

Personnellement, je ne suis au courant de rien qui puisse être accompli uniquement via XML et non via les méthodes Java du SDK. En fait, par définition, tout doit être faisable via Java (mais pas nécessairement via des méthodes accessibles par SDK), car XML n'est pas un code exécutable. Mais si vous êtes au courant de quelque chose, signalez-le, car il s’agit d’un bogue du SDK qui devrait être corrigé un jour.

62
CommonsWare

Pour ajouter des marges directement aux éléments (certains éléments permettent l'édition directe des marges), vous pouvez effectuer les opérations suivantes:

LayoutParams lp = ((ViewGroup) something).getLayoutParams();
if( lp instanceof MarginLayoutParams )
{
    ((MarginLayoutParams) lp).topMargin = ...;
    ((MarginLayoutParams) lp).leftMargin = ...;
    //... etc
}
else
    Log.e("MyApp", "Attempted to set the margins on a class that doesn't support margins: "+something.getClass().getName() );

... cela fonctionne sans avoir besoin de connaître/éditer la disposition environnante. Notez la vérification "instanceof" dans le cas où vous essayez de l'exécuter contre quelque chose qui ne prend pas en charge les marges.

30
Adam

En raison de la variation des densités de pixels de l'écran du périphérique, il est toujours bon d'utiliser DIP pour définir la marge par programme. Comme ci-dessous_

//get resources
Resources r = getResources();
float pxLeftMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxTopMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxRightMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, r.getDisplayMetrics());
float pxBottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics());

//get layout params...
LayoutParams params=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
params.setMargins(Math.round(pxLeftMargin), Math.round(pxTopMargin), Math.round(pxRightMargin), Math.round(pxBottomMargin));

//set margin...
yourLayoutTOsetMargin.setLayoutParams(params); 

J'espère que cela aidera.

21
Rupesh Yadav

J'ai défini les marges directement en utilisant le code ci-dessous

LinearLayout layout = (LinearLayout)findViewById(R.id.yourrelative_layout);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);            
params.setMargins(3, 300, 3, 3); 
layout.setLayoutParams(params);

La seule chose ici est de noter que LayoutParams doit être importé pour le paquetage suivant Android.widget.RelativeLayout.LayoutParams, sinon il y aura une erreur.

10
Janith
 MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
 layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
7
Ginni

Essaye ça

 LayoutParams params = new LayoutParams(
            LayoutParams.WRAP_CONTENT,      
            LayoutParams.WRAP_CONTENT
    );
    params.setMargins(left, top, right, bottom);
    yourbutton.setLayoutParams(params);
7
Karan Bhalodiya

Essaye ça:

MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
4
Makvin
/*
 * invalid margin
 */
private void invalidMarginBottom() {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) frameLayoutContent.getLayoutParams();
    lp.setMargins(0, 0, 0, 0);
    frameLayoutContent.setLayoutParams(lp);
}

vous devriez être au courant du type de viewGroup de la vue. Dans le code ci-dessus, par exemple, je veux changer la marge de frameLayout et le groupe de vues de frameLayout est un RelativeLayout , donc vous devez convertir à (RelativeLayout.LayoutParams)

3
Francis Shi

Voici une seule ligne Solution:

((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));
0
Stappo