Hai thuộc tính này thường gây nhầm lẫn. Tóm gọn: gravity căn chỉnh nội dung bên trong View, layout_gravity căn chỉnh View bên trong Parent.
android:gravity
Áp dụng cho nội dung (content) của View (text, drawable, child views trong container).
Giá trị phổ biến
top,bottom,left,right,centercenter_vertical,center_horizontalstart,end(hỗ trợ RTL)fill,fill_vertical,fill_horizontal,clip_vertical,clip_horizontal
Ví dụ
android:layout_gravity
Áp dụng cho View này relative to Parent (chỉ hoạt động trong LinearLayout, FrameLayout, GridLayout...). Không hoạt động trong ConstraintLayout (dùng constraint).
Giá trị phổ biến
top,bottom,left,right,centercenter_vertical,center_horizontalstart,endfill,fill_vertical,fill_horizontal
Ví dụ
So sánh trực quan
| Thuộc tính | Áp dụng cho | Container hỗ trợ | Ví dụ |
|---|---|---|---|
| gravity | Nội dung bên trong View | Tất cả View/ViewGroup | TextView, Button, LinearLayout |
| layout_gravity | View này trong Parent | LinearLayout, FrameLayout, GridLayout, TableLayout | Button trong LinearLayout |
Ví dụ minh họa tổng hợp
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- Container 1: LinearLayout vertical -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#E0E0E0"
android:orientation="vertical"
android:gravity="center"> <!-- gravity: căn children giữa container -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="gravity=center (của parent)"
android:textSize="16sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end" <!-- layout_gravity: căn button này sang phải -->
android:text="layout_gravity=end" />
</LinearLayout>
<View android:layout_width="match_parent" android:layout_height="8dp" />
<!-- Container 2: FrameLayout -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#FFF3E0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" <!-- Căn giữa FrameLayout -->
android:text="layout_gravity=center trong FrameLayout"
android:textSize="16sp" />
</FrameLayout>
</LinearLayout>
ConstraintLayout: Không dùng layout_gravity
Trong ConstraintLayout, dùng constraints:
Chạy thử nghiệm
Tạo layout như ví dụ tổng hợp. Quan sát:
- Text "gravity=center" nằm giữa container xám (do parent LinearLayout có gravity=center)
- Button "layout_gravity=end" nằm bên phải container xám
- Text trong FrameLayout cam nằm chính giữa
Mẹo nhớ
- gravity = Gravity inside (trọng lực bên trong) → kéo nội dung
- layout_gravity = Layout gravity (trọng lực bố cục) → kéo view này trong parent