How to set layout_gravity programmatically?

AndroidAndroid Layout

Android Problem Overview


My question is simple,

How to set my buttons layout_gravity programmatically?

I found this on internet, but it simply throws me a Nullpointer exception:

 Button MyButton = new Button(this);
    
    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 
    
    
    MyLinearLayout.addView(MyButton);

Any solution?

Android Solutions


Solution 1 - Android

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
}

For gravity values and how to set gravity check Gravity.

Basically, you should choose the LayoutParams depending on the parent. It can be RelativeLayout, LinearLayout etc...

Solution 2 - Android

I'd hate to be resurrecting old threads but this is a problem that is not answered correctly and moreover I've ran into this problem myself.

Here's the long bit, if you're only interested in the answer please scroll all the way down to the code:

android:gravity and android:layout_gravity works differently. Here's an article I've read that helped me.

GIST of article: gravity affects view after height/width is assigned. So gravity centre will not affect a view that is done FILL_PARENT (think of it as auto margin). layout_gravity centre WILL affect view that is FILL_PARENT (think of it as auto pad).

Basically, android:layout_gravity CANNOT be access programmatically, only android:gravity. In the OP's case and my case, the accepted answer does not place the button vertically centre.

To improve on Karthi's answer:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

Link to LinearLayout.LayoutParams.

android:layout_gravity shows "No related methods" meaning cannot be access programatically. Whereas gravity is a field in the class.

Solution 3 - Android

I had a similar problem with programmatically setting layout_gravity on buttons in a GridLayout.

The trick was to set gravity on the button layoutParams AFTER the button was added to a parent (GridLayout), otherwise the gravity would be ignored.

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

Solution 4 - Android

MyButton.setGravity(Gravity.RIGHT);

For layout_gravity use the answer stated by "karthi". This method sets gravity to place the children inside the view.

Solution 5 - Android

If you want to change the layou_gravity of an existing view do this:

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

Remember to use the right LayoutParams based on the Layout type your view is in. Ex:

LinearLayout.LayoutParams

Solution 6 - Android

layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

use this to add mor than one gravity

Solution 7 - Android

This question is old but I just had the same problem and solved it like this

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

Solution 8 - Android

KOTLIN setting more than one gravity on FrameLayout without changing size:

     // 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()

Solution 9 - Android

If you want to put a view in the center of parent, you can do with following code..

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

these code section make LinearLayout put the first view elements in the center of parent. So, we system don't consider the initial width and high to arrange view in the center . I do the code section well.

Solution 10 - Android

I use someting like that: (Xamarin and C# code)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);
    
    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

the SetGravity puts my textView in the center of the layout. So SetGravity layout property refer to layout content

Solution 11 - Android

In case you need to set Gravity for a View use the following

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

For setting layout_gravity for the Button use gravity field for the layoutparams as

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

try this hope this clears thanks

Solution 12 - Android

The rest of the answers are right, I want to add more explaination. The layout_gravity is about how to position the view in parent view.

You must set gravity **after method parentView.addView() ** was called. We can see the 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();
}

And the problem of null pointer is because it's not calling addView before getLayoutParams().

The annotation was already said "This method may return null if this View is not attached to a parent ViewGroup or {@link#setLayoutParams(android.view.ViewGroup.LayoutParams)} was not invoked successfully. When a View is attached to a parent ViewGroup, this method must not return null."

Solution 13 - Android

to RelativeLayout, try this code , it works for me: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

Solution 14 - Android

Perfectly Working!!! None of the above answer works for me. In Xml file setting gravity and setting layout_gravity is different. Check out the below code

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

Also check This,where you can find clear explanation about gravity and layout_gravity .

Solution 15 - Android

Most of above answer are right, so written a helper methods, so you can use it directly in you project .

> set layout_gravity programmtically

// 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;
    }

Solution 16 - Android

I switched from LinearLayout.LayoutParams to RelativeLayout.LayoutParams to finally get the result I was desiring on a custom circleview I created.

But instead of gravity you use addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams(circleheight,circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

Solution 17 - Android

Try this code

    Button btn = new Button(YourActivity.this);
    btn.setGravity(Gravity.CENTER | Gravity.TOP);
    btn.setText("some text");

or

    btn.setGravity(Gravity.TOP);

Solution 18 - Android

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

Solution 19 - Android

FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);

Solution 20 - Android

Modify the existing layout params and set layout params again

//Get the current layout params and update the Gravity
(iv.layoutParams as FrameLayout.LayoutParams).gravity = Gravity.START
//Set layout params again (this updates the view)
iv.layoutParams = layoutParams

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam VarhegyiView Question on Stackoverflow
Solution 1 - AndroidKarthiView Answer on Stackoverflow
Solution 2 - AndroidUknightView Answer on Stackoverflow
Solution 3 - AndroidowjsubView Answer on Stackoverflow
Solution 4 - AndroidYashwanth KumarView Answer on Stackoverflow
Solution 5 - AndroidvovahostView Answer on Stackoverflow
Solution 6 - AndroidOmar AlnajjarView Answer on Stackoverflow
Solution 7 - AndroidCodeFlakesView Answer on Stackoverflow
Solution 8 - AndroidHitesh SahuView Answer on Stackoverflow
Solution 9 - AndroidChengView Answer on Stackoverflow
Solution 10 - Androidalin0509View Answer on Stackoverflow
Solution 11 - Androiduser2779311View Answer on Stackoverflow
Solution 12 - AndroidSnow AlbertView Answer on Stackoverflow
Solution 13 - Androidmichael wangView Answer on Stackoverflow
Solution 14 - AndroidTaraView Answer on Stackoverflow
Solution 15 - AndroidAbhishek GargView Answer on Stackoverflow
Solution 16 - Androiduser3886197View Answer on Stackoverflow
Solution 17 - AndroidFakhriddin AbdullaevView Answer on Stackoverflow
Solution 18 - AndroidManthan PatelView Answer on Stackoverflow
Solution 19 - AndroidVIVEK CHOUDHARYView Answer on Stackoverflow
Solution 20 - AndroidSaiView Answer on Stackoverflow