Reputation: 128438
I know we can set the following values to the android:gravity
and android:layout_gravity
properties:
center
center_vertical
center_horizontal
, etc.But I am confused regarding both of these.
What is the difference between the usage of android:gravity
and android:layout_gravity
?
Upvotes: 1469
Views: 666391
Reputation: 81
android:gravity handles the alignment of its children, it sets the gravity of the content of the View it’s used on. In other words it just focuses on the centering of all child views in the parent view. So it works better on a parent view.
android:layout_gravity handles the alignment of itself, it sets the gravity of the View or Layout relative to its parent. In other words it focuses on centering a specific child view in the parent view. So it works better on the child view you want centralized.
Upvotes: 1
Reputation: 463
If we want to set the gravity of content inside a view then we will use "android:gravity", and if we want to set the gravity of this view (as a whole) with in its parent view then we will use "android:layout_gravity".
Upvotes: 15
Reputation: 1372
Just thought I'd add my own explanation here - coming from a background on iOS, this is how I've internalized the two in iOS terms:
Layout Gravity affects your position in the superview. Gravity affects the position of your subviews within you.
Said another way, Layout Gravity positions you yourself while Gravity positions your children.
Upvotes: 9
Reputation: 2780
Short Answer: use android:gravity
or setGravity()
to control gravity of all child views of a container; use android:layout_gravity
or setLayoutParams()
to control gravity of an individual view in a container.
Long story: to control gravity in a linear layout container such as LinearLayout
or RadioGroup
, there are two approaches:
To control the gravity of ALL child views of a LinearLayout
container (as you did in your book), use android:gravity
(not android:layout_gravity
) in layout XML file or setGravity()
method in code.
To control the gravity of a child view in its container, use android:layout_gravity
XML attribute. In code, one needs to get the LinearLayout.LayoutParams
of the view and set its gravity. Here is a code example that set a button to bottom in a horizontally oriented container:
import android.widget.LinearLayout.LayoutParams;
import android.view.Gravity;
...
Button button = (Button) findViewById(R.id.MyButtonId);
// need to cast to LinearLayout.LayoutParams to access the gravity field
LayoutParams params = (LayoutParams)button.getLayoutParams();
params.gravity = Gravity.BOTTOM;
button.setLayoutParams(params);
For horizontal LinearLayout
container, the horizontal gravity of its child view is left-aligned one after another and cannot be changed. Setting android:layout_gravity
to center_horizontal
has no effect. The default vertical gravity is center (or center_vertical) and can be changed to top or bottom. Actually the default layout_gravity
value is -1
but Android put it center vertically.
To change the horizontal positions of child views in a horizontal linear container, one can use layout_weight
, margin and padding of the child view.
Similarly, for vertical View Group container, the vertical gravity of its child view is top-aligned one below another and cannot be changed. The default horizontal gravity is center (or center_horizontal
) and can be changed to left or right.
Actually, a child view such as a button also has android:gravity
XML attribute and the setGravity()
method to control its child views -- the text in it. The Button.setGravity(int)
is linked to this developer.android.com entry.
Upvotes: 43
Reputation: 53
Gravity and layout_gravity both are the XML attributes.
The android:gravity attribute is used to arrange the position of the content inside a view (for example text inside a Button widget).
The android:layout_gravity is used to arrange the position of the entire View relative to it’s container.
For further details you can see this link.
Upvotes: 0
Reputation: 7537
android:layout_gravity
is the Outside gravity of the View. Specifies the direction in which the View should touch its parent's border.
android:gravity
is the Inside gravity of that View. Specifies in which direction its contents should align.
(if you are coming from a web development background)
Android | CSS
————————————————————————+————————————
android:layout_gravity | float
android:gravity | text-align
Take layout-gravity
as "Lay-outside-gravity".
Upvotes: 485
Reputation: 483
The android:gravity
sets the gravity (position) of the children whereas the android:layout_gravity
sets the position of the view itself. Hope it helps
Upvotes: 1
Reputation: 50432
Their names should help you:
android:gravity
sets the gravity of the contents (i.e. its subviews) of the View
it's used on. android:layout_gravity
sets the gravity of the View
or Layout
relative to its parent. And an example is here.
Upvotes: 1466
Reputation: 337
gravity--Applies to its own view.
layout-gravity---Applies to view related to its parent.
Upvotes: 0
Reputation: 13218
An easy trick to remember this is gravity applies to us inside earth. So, android:gravity
is for inside the view.
Rememeber the out in layout_gravity which would help you to remember that android:layout_gravity
would refer to outside the view
Upvotes: 9
Reputation: 932
Gravity: Allow you move the content inside a container. (How sub-views will be placed).
Important: (MOVE along X-axis or Y-axis within available space).
Example: Let's say if you were to work with LinearLayout (Height: match_parent, Width: match_parent) as root level element, then you will have full frame space available; and the child views says 2 TextViews (Height: wrap_content, Width: wrap_content) inside the LinearLayout can be moved around along x/y axis using corresponding values for gravity on parent.
Layout_Gravity: Allow you to override the parent gravity behavior ONLY along x-axis.
Important: (MOVE[override] along X-axis within available space).
Example: If you keep in mind the previous example, we know gravity enabled us to move along x/y axis, i.e; the place TextViews inside LinearLayout. Let's just say LinearLayout specifies gravity: center; meaning every TextView needs to be center both vertically and horizontally. Now if we want one of the TextView to go left/right, we can override the specified gravity behavior using layout_gravity on the TextView.
Bonus: if you dig deeper, you will find out that text within the TextView act as sub-view; so if you apply the gravity on TextView, the text inside the TextView will move around. (the entire concept apply here too)
Upvotes: 3
Reputation: 1304
gravity: is used for simple views like textview, edittext etc.
layout_gravity: is used for current view only gravity in context of it's relative parent view like linear Layout or FrameLayout to make view in center or any other gravity of its parent.
Upvotes: 1
Reputation: 878
android:gravity
-> Sets the gravity of the content of the View its used on.
android:layout_gravity
-> Sets the gravity of it's Parent's view or Layout
Upvotes: 0
Reputation: 211
Gravity is used to set text alignment in views but layout_gravity is use to set views it self. Lets take an example if you want to align text written in editText then use gravity and you want align this editText or any button or any view then use layout_gravity, So its very simple.
Upvotes: 1
Reputation: 512506
gravity
arranges the content inside the view. layout_gravity
arranges the view's position outside of itself.Sometimes it helps to see a picture, too. The green and blue are TextViews
and the other two background colors are LinearLayouts
.
layout_gravity
does not work for views in a RelativeLayout
. Use it for views in a LinearLayout
or FrameLayout
. See my supplemental answer for more details.gravity
won't have any effect. Thus, wrap_content
and gravity
are meaningless together.layout_gravity
won't have any effect. Thus, match_parent
and layout_gravity
are meaningless together.layout_gravity=center
looks the same as layout_gravity=center_horizontal
here because they are in a vertical linear layout. You can't center vertically in this case, so layout_gravity=center
only centers horizontally.gravity
and layout_gravity
on the views within a layout. To see what happens when you set the gravity
of the of the parent layout itself, check out the supplemental answer that I referred to above. (Summary: gravity
doesn't work well on a RelativeLayout
but can be useful with a LinearLayout
.)So remember, layout_gravity arranges a view in its layout. Gravity arranges the content inside the view.
Here is the xml for the above image for your reference:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#e3e2ad"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="gravity=" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="left"
android:text="left" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="right"
android:text="right" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center"
android:text="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#d6c6cd"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="layout_gravity=" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="left"
android:background="#bcf5b1"
android:text="left" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:background="#aacaff"
android:text="center_horizontal" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="right"
android:background="#bcf5b1"
android:text="right" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:background="#aacaff"
android:text="center" />
</LinearLayout>
</LinearLayout>
Upvotes: 614
Reputation: 719
android:gravity
is used to adjust for content of the view relative to its specify position (allocated area). android:gravity="left"
would not do anything if layout_width
is equal to the "wrap_content"
android:layout_gravity
is used for view itself relative to the parent or layout file.
Upvotes: 0
Reputation: 9056
There is many difference in the gravity
and layout-gravity
. I am going to explain my experience about these 2 concepts(All information i got due to my observation and some websites).
Use Of Gravity and Layout-gravity in
FrameLayout
.....
Note:-
Gravity is used inside the View Content as some User have answer and it is same for all ViewGroup Layout
.
Layout-gravity
is used with the parent View as some User have answer.
Gravity and Layout-gravity
is work more useful with the FrameLayout
childs . We can't use Gravity and Layout-gravity
in FrameLayout's Tag ....
We can set Child View any where in the FrameLayout
using layout-gravity
.
We can use every single value of gravity inside the FrameLayout (eg:- center_vertical
, center_horizontal
, center
,top
, etc), but it is not possible with other ViewGroup Layouts .
FrameLayout
fully working on Layout-gravity
. Example:- If you work on FrameLayout
then you don't need to change whole Layout for adding new View. You just add View as last in the FrameLayout
and give him Layout-gravity
with value.(This is adavantages of layout-gravity with FrameLayout).
have look on example ......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#264bd1"
android:gravity="center"
android:layout_gravity="center"
android:text="Center Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#1b64b9"
android:gravity="bottom"
android:layout_gravity="bottom|center"
android:text="Bottom Layout Gravity" />
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#d75d1c"
android:gravity="top"
android:layout_gravity="top|center"
android:text="Top Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginTop="100dp"
android:textColor="#d71f1c"
android:gravity="top|right"
android:layout_gravity="top|right"
android:text="Top Right Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginBottom="100dp"
android:textColor="#d71cb2"
android:layout_gravity="bottom"
android:gravity="bottom"
android:text="Top Left Layout Gravity"/>
</FrameLayout>
Output:-
Use Of Gravity and Layout-gravity in LinearLayout .....
Gravity
working same as above but here differnce is that we can use Gravity inside the LinearLayout View
and RelativeLayout View
which is not possible in FrameLayout View
.
LinearLayout with orientation vertical ....
Note:- Here we can set only 3 values of layout_gravity
that is (left
| right
| center
(also called center_horizontal
)).
have look on example :-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#264bd1"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:text="Center Layout Gravity \nor \nCenter_Horizontal"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginTop="20dp"
android:textColor="#d75d1c"
android:layout_gravity="right"
android:text="Right Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginBottom="100dp"
android:textColor="#d71cb2"
android:layout_gravity="left"
android:layout_marginTop="20dp"
android:gravity="bottom"
android:text="Left Layout Gravity"/>
</LinearLayout>
Output:-
LinearLayout with orientation horizontal ....
Note:- Here we can set also 3 values of layout_gravity
that is (top
| bottom
| center
(also called center_vertical
)).
have look on example :-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="match_parent">
<TextView
android:layout_width="120dp"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#264bd1"
android:gravity="center"
android:layout_gravity="bottom"
android:text="Bottom \nLayout \nGravity"/>
<TextView
android:layout_width="120dp"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginTop="20dp"
android:textColor="#d75d1c"
android:layout_gravity="center"
android:text="Center \nLayout \nGravity"/>
<TextView
android:layout_width="150dp"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginBottom="100dp"
android:textColor="#d71cb2"
android:layout_gravity="left"
android:layout_marginTop="20dp"
android:text="Left \nLayout \nGravity"/>
</LinearLayout>
output:-
Note:- We can't use layout_gravity
in the RelativeLayout Views
but we can use gravity
to set RelativeLayout
childs to same position....
Upvotes: 7
Reputation: 1133
The basic difference between the two is that-
android:gravity is used for child elements of the view.
android:layout_gravity is used for this element with respect to parent view.
Upvotes: 4
Reputation: 75798
android:gravity
is used to specify how to place the content of the object within the object itself. In another word, android:gravity is used to specify the gravity of the content of the view.
android:layout_gravity
is an attribution the child can supply to its parent, to specify the gravity the view within its parents.
For more details you can visit
http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
Upvotes: 3
Reputation: 173
Something I saw on Sandip's blog that I almost missed, fixed my problem. He said layout_gravity
DOES NOT WORK WITH LinearLayout
.
If you're using a LinearLayout
and the gravity settings are driving you nuts (like me), then switch to something else.
I actually switched to a RelativeLayout
then used layout_alignParentLeft
and layout_alignParentRight
on the 2 contained TextView
s to get them on one line to go far left and far right.
Upvotes: 5
Reputation: 3854
From what I can gather layout_gravity is the gravity of that view inside its parent, and gravity is the gravity of the children inside that view.
I think this is right but the best way to find out is to play around.
Upvotes: 38