androidandroid-linearlayoutgravitylayout-gravity

How to set both gravity and layout gravity of a LinearLayout programatically


I am risking writing a duplicate question, but as I was researching the answer to another SO question, I realized that I couldn't find a simple question and answer that included setting both gravity and layout_gravity of a LinearLayout. Also, I was confused as to the difference between them when talking about a ViewGroup rather than just a view. I am answering my question below.

Here are some of the other questions I viewed:


Solution

  • Short answer

    Set gravity

    linearLayout.setGravity(Gravity.CENTER);
    

    Set layout gravity

    // the LinearLayout's parent is a FrameLayout      
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(400, 400);
    params.gravity = Gravity.TOP|Gravity.RIGHT;
    linearLayout.setLayoutParams(params);
    

    Background

    Previously, I have explained the difference between 'gravity' and `layout_gravity' for views within a layout.

    Setting the gravity of a LinearLayout itself changes the location of the views within it. Setting the layout_gravity of a LinearLayout changes how the LinearLayout is arranged within its parent layout.

    This image shows a LinearLayout (brown) within a FrameLayout (white). The LinearLayout's gravity is set to center_horizontal and its layout_gravity is set to right|bottom.

    enter image description here

    Here is the xml:

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <LinearLayout
            android:id="@+id/llExample"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="right|bottom"
            android:background="#e3e2ad"
            android:gravity="center_horizontal"
            android:orientation="vertical" >
    
            <TextView
                android:id="@+id/textView1"
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:background="#bcf5b1"
                android:text="TextView 1" />
    
            <TextView
                android:id="@+id/textView1"
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:background="#aacaff"
                android:text="TextView 2" />
    
        </LinearLayout>
    
    </FrameLayout>
    

    Changing things programmatically

    The following code shows how to change both the gravity and the layout_gravity of the LinearLayout.

    public class LinearLayoutGravity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.linear_layout_gravity);
    
            // Change the gravity (not layout_gravity) of the LinearLayout
            LinearLayout ll = (LinearLayout) findViewById(R.id.llExample);
            ll.setGravity(Gravity.CENTER);
    
            // Change the layout_gravity (not gravity) of the LinearLayout      
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(400, 400);
            params.gravity = Gravity.TOP|Gravity.RIGHT;
            ll.setLayoutParams(params);
        }
    }
    

    And here is the result:

    enter image description here

    See also