Ma question est simple
Comment définir mes boutons layout_gravity par programme?
J'ai trouvé ceci sur Internet, mais cela me jette simplement une exception Nullpointer:
Button MyButton = new Button(this);
LinearLayout.LayoutParams lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
lllp.gravity=Gravity.RIGHT;
MyButton.setLayoutParams(lllp);
MyLinearLayout.addView(MyButton);
Toute solution?
Java
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;
button.setLayoutParams(params);
Kotlin
val params = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
weight = 1.0f
gravity = Gravity.TOP
}
Pour les valeurs de gravité et comment définir le contrôle de gravité Gravity .
Fondamentalement, vous devriez choisir le LayoutParams
en fonction du parent. Cela peut être RelativeLayout
, LinearLayout
etc ...
Je détesterais être de ressusciter de vieux threads mais c'est un problème auquel on ne répond pas correctement et de plus, j'ai rencontré ce problème moi-même.
Voici le long morceau, si la réponse ne vous intéresse que s'il vous plaît faites défiler jusqu'au code:
Android: Gravity et Android: layout_gravity fonctionne différemment. Ici c'est un article que j'ai lu qui m'a aidé.
Résumé de l'article: la gravité affecte la vue après l'attribution de la hauteur/largeur. Ainsi, le centre de gravité n’affectera pas la vue réalisée FILL_PARENT (considérez-la comme une marge automatique). layout_gravity center affectera la vue qui est FILL_PARENT (considérez-la comme un pad automatique).
Fondamentalement, Android: layout_gravity NE PEUT PAS être accessible par programmation, seul Android: gravité. Dans le cas du PO et dans mon cas, la réponse acceptée ne place pas le bouton verticalement au centre.
Pour améliorer la réponse de Karthi:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);
Lien vers LinearLayout.LayoutParams
.
Android: layout_gravity indique "Aucune méthode associée", ce qui signifie qu'il est impossible d'accéder par programme. Considérant que la gravité est un domaine dans la classe.
MyButton.setGravity(Gravity.RIGHT);
Pour layout_gravity, utilisez la réponse indiquée par "karthi". Cette méthode définit la gravité pour placer les enfants dans la vue.
J'ai eu un problème similaire avec définir par programme layout_gravity sur les boutons dans un GridLayout.
L'astuce consistait à définir la gravité du bouton layoutParams APRÈS le bouton était ajouté à un parent (GridLayout), sinon la gravité serait ignorée.
grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
Si vous voulez changer le layou_gravity
d'une vue existante, procédez comme suit:
((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;
N'oubliez pas d'utiliser la bonne LayoutParams
selon le type de disposition dans lequel se trouve votre vue. Ex:
LinearLayout.LayoutParams
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;
utilisez-le pour ajouter plus d'une gravité
Cette question est ancienne mais je viens d'avoir le même problème et résolu comme ça
LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
J'utilise quelque chose comme ça: (Xamarin et code C #)
LinearLayout linLayout= new LinearLayout(this);
linLayout.SetGravity(GravityFlags.Center);
TextView txtView= new TextView(this);
linLayout.AddView(txtView);
setGravity met ma textView au centre de la mise en page. Donc, SetGravity propriété de mise en page fait référence à la mise en page conten
KOTLIN définissant plus d’une gravité sur FrameLayout sans changer de taille:
// assign more than one gravity,Using the operator "or"
var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
// update gravity
(pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
// refresh layout
pagerContainer.requestLayout()
Si vous voulez mettre une vue au centre du parent, vous pouvez le faire avec le code suivant.
public class myLayout extends LinearLayout {
public myLayout(Context context) {
super(context);
RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
R.layout.activity_main, null);
LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
cc.gravity = Gravity.CENTER;
this.setGravity(Gravity.CENTER);
this.addView(vi);
}
}
ces sections de code font que LinearLayout place les premiers éléments de vue au centre du parent. Donc, nous ne considérons pas la largeur initiale et haute pour organiser la vue au centre. Je fais bien la section de code.
Le reste des réponses est correct, je veux ajouter plus d'explications. Layout_gravity explique comment positionner la vue dans la vue parent.
Vous devez définir la gravité ** après l'appel de la méthode parentView.addView () **. Nous pouvons voir le code:
public void setLayoutParams(ViewGroup.LayoutParams params) {
if (params == null) {
throw new NullPointerException("Layout parameters cannot be null");
}
mLayoutParams = params;
resolveLayoutParams();
if (mParent instanceof ViewGroup) {
((ViewGroup) mParent).onSetLayoutParams(this, params);
}
requestLayout();
}
Et le problème du pointeur null est qu'il n'appelle pas addView avant getLayoutParams ().
L'annotation a déjà été dite "Cette méthode peut renvoyer null si cette vue n'est pas attachée à un ViewGroup parent ou {@ link # setLayoutParams (Android.view.ViewGroup.LayoutParams)} n'a pas été appelée avec succès. Lorsqu'une vue est attachée à un parent ViewGroup, cette méthode ne doit pas renvoyer null. "
Si vous devez définir Gravity pour une vue, utilisez les options suivantes:
Button b=new Button(Context);
b.setGravity(Gravity.CENTER);
Pour définir layout_gravity pour le bouton, utilisez le champ de gravité pour les layoutparams comme
LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;
essayez cet espoir cela efface merci
Parfaitement travaillé !!! Aucune des réponses ci-dessus ne fonctionne pour moi. Dans les fichiers XML, le paramètre gravity et le paramètre layout_gravity sont différents. Découvrez le code ci-dessous
// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
messageLL.setLayoutParams(params);
messageText.setVisibility(View.GONE);
messageNoText.setVisibility(View.VISIBLE);
messageLL.addView(messageNoText);
Vérifiez également Ceci, où vous pouvez trouver une explication claire sur la gravité et la mise en page.
relativeLayout, essayez ce code, il fonctionne pour moi: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
Je suis passé de LinearLayout.LayoutParams à RelativeLayout.LayoutParams pour obtenir enfin le résultat que je souhaitais sur un circuit personnalisé que j'ai créé.
Mais au lieu de la gravité, vous utilisez addRule
RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (circleheight, circleheight);
mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
int width=getResources().getDisplayMetrics().widthPixels;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
(width, width);
params.gravity = Gravity.CENTER;
iv_main_text = new HTextView(getContext());
iv_main_text.setLayoutParams(params);
iv_main_text.setBackgroundColor(Color.BLUE);
iv_main_text.setTextSize(60);
iv_main_text.setGravity(Gravity.CENTER);
iv_main_text.setTextColor(Color.BLACK);
Essayez ce code
Button btn = new Button(YourActivity.this);
btn.setGravity(Gravity.CENTER | Gravity.TOP);
btn.setText("some text");
ou
btn.setGravity(Gravity.TOP);
La plupart des réponses ci-dessus sont exactes; écrivez donc une méthode d'assistance, afin que vous puissiez l'utiliser directement dans votre projet.
set
layout_gravity
par programmation
_// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.
// for single view
public static void setLayoutGravity(int gravity, View view){
((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
}
// for mulitple views
public static void setLayoutGravity(int gravity, View ...view){
for(View item : view)
((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
}
_