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.
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);
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.
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.
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.
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.
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
layoutParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
Essaye ça
LayoutParams params = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
);
params.setMargins(left, top, right, bottom);
yourbutton.setLayoutParams(params);
Essaye ça:
MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();
params.width = 250;
params.leftMargin = 50;
params.topMargin = 50;
/*
* 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)
Voici une seule ligne Solution:
((LinearLayout.LayoutParams) yourLinearLayout.getLayoutParams()).marginToAdd = ((int)(Resources.getSystem().getDisplayMetrics().density * yourDPValue));