Làm thế nào để căn chỉnh LinearLayout ở tâm của nó?


80

Tôi đã xem qua nhiều câu hỏi tương tự ở đây tại SO, nhưng không có gì hữu ích. Tôi có một hệ thống phân cấp của các bố cục lồng nhau khác nhau, tất cả đều có android:layout_width="fill_parent"và bố cục bên trong nhất có android:layout_width="wrap_content- tôi cần căn chỉnh nó ở trung tâm (theo chiều ngang). Làm thế nào để làm điều đó?

Cập nhật:: Tôi đã tìm ra nguyên nhân của sự cố - nếu tôi đặt LinearLayout bên trong vào RelativeLayout với android:layout_width="fill_parent", nó vẫn kết thúc nội dung của nó. Tuy nhiên, TableRow đang thực sự lấp đầy màn hình.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
            <TableRow >
            <LinearLayout 
            android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                    <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="1"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                     <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="2"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
             </LinearLayout>
           </TableRow>
        </TableLayout>
    </FrameLayout>
</LinearLayout>

Câu trả lời:


230

Hai thuộc tính này thường bị nhầm lẫn:

  • android:gravity đặt mức độ hấp dẫn của nội dung Chế độ xem mà nó được sử dụng.
  • android:layout_gravityđặt lực hấp dẫn của Chế độ xem hoặc Bố cục so với bố mẹ của nó .

Vì vậy, đặt android:gravity="center"trên cha mẹ hoặc android:layout_gravity="center"trên chính LinearLayout.

Tôi đã nhiều lần bắt gặp bản thân trộn lẫn chúng và tự hỏi tại sao mọi thứ không tập trung đúng vào tâm ...


1
Tôi đã thử android:layout_gravity="center"bố cục có chứa TextView - không giúp được gì, nó vẫn được căn trái. Cũng cố gắng đặt chiều rộng của bố cục này thành wrapfill- không có sự khác biệt.
Violet Giraffe

1
Bạn đã thử sử dụng công cụ Pixel Perfect trong Eclipse chưa? Nó hiển thị cho bạn các đường viền trên các bố cục trên phiên bản trực tiếp của ứng dụng của bạn, vì vậy bạn thường có thể tìm ra nơi bạn đã sai.
jkschneider

+1 để giải thích sự khác biệt khó hiểu giữa cách sử dụng từ khóa "trọng lực" của phần tử và phần tử gốc.
scmoi

+1 vì nó giải quyết được vấn đề của tôi. Ví dụ của tôi => Tôi có một bố cục tuyến tính và một chế độ xem văn bản trong đó. Nó hoạt động cho texview. Nó căn giữa tw theo chiều ngang.
alicanbatur

Không layout_gravity cho LinearLayout
Sayka

15

Vui lòng thử điều này trong bố cục tuyến tính của bạn

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

2
các thông số này là dành cho RelativeLayout
danijax

2
Đây không phải là các thông số Bố cục Tuyến tính
pcodex

Không thể sử dụng điều này trong bố cục tuyến tính.
Christopher Smit

10
<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <LinearLayout 
            android:orientation="horizontal"
            android:layout_centerHorizontal="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <TextView
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
                 android:text="1"
                 android:textAppearance="?android:attr/textAppearanceLarge" />

           <TextView
                 android:layout_height="wrap_content"
                 android:layout_width="wrap_content"
                 android:text="2"
                 android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>
</RelativeLayout>

hãy xem xét việc bao bọc relativeLayout qua LinearLayout. android:layout_centerHorizontal="true"sẽ đặt tâm xem theo phương ngang.


Đã thử điều đó. Nó không hoạt động! Tôi không hiểu chuyện gì đang xảy ra ở đó ... Tôi đã đăng toàn bộ mã XML của mình, tôi chỉ cắt bớt một số hàng trong bảng khác. Có gì sai với bố cục của tôi?
Violet Giraffe,

nó có liên quan gì đó đến các hàng trong bảng mà tôi nghĩ, họ thêm các con vào bên trái. xem xét việc cấp layout_width = "fill_parent" cho thẻ hàng trong bảng.
Yashwanth Kumar

cho cài đặt xml trong câu trả lời này, nếu vẫn gặp sự cố, hãy kiểm tra lại LinearLayoutxem layout_widthcái nào nên wrap_contentvà không match_parent. Cùng một logic áp dụng cho việc xếp thẳng theo chiều dọc
kellogs

5

thêm layout_gravity="center"hoặc "center_horizontal"vào bố cục mẹ.

Một lưu ý nhỏ, LinearLayoutbên trong của bạn TableRowdường như không cần thiết, vì a TableRowđã là một chiều ngang LinearLayout.


Nó là cần thiết, bởi vì tôi cần bảng để điền vào cha mẹ và chỉ một số hàng được căn giữa. Và layout_gravity không giúp được gì.
Violet Giraffe

3

Thử cái này:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
            <TableRow >
            <LinearLayout 
            android:orientation="horizontal"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center_horizontal" 
                    android:layout_gravity="center_horizontal" >
                    <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="1"
                    android:textAppearance="?android:attr/textAppearanceLarge" />

                     <TextView
                    android:layout_height="wrap_content"
                    android:layout_width="wrap_content"
                    android:text="2"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
             </LinearLayout>
           </TableRow>
        </TableLayout>
    </FrameLayout>
</LinearLayout>

3

Điều này đã làm việc cho tôi .. thêm chế độ xem trống ..

<LinearLayout
       android:layout_width="match_parent"
        android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
        android:orientation="horizontal"
         >
<View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            />  
     <com.google.android.gms.ads.AdView

         android:id="@+id/adView"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"

         android:layout_gravity="center_horizontal"
         ads:adSize="BANNER"
         ads:adUnitId="@string/banner_ad_unit_id" >

    </com.google.android.gms.ads.AdView>
    <View
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            />  
    </LinearLayout>

2

Hãy thử <TableRow android:gravity="center_horizontal">Thao tác này sẽ căn giữa LinearLayout bên trong trong tablerow.


2

Tôi đã phải đối mặt với tình huống tương tự khi thiết kế thông báo tùy chỉnh. Tôi đã thử với thuộc tính sau được đặt với true.

 android:layout_centerInParent.

2

điều này đã làm việc cho tôi.

<LinearLayout>
.
.
.
android:gravity="center"
.
.>

<TextView
android:layout_gravity = "center"
/>
<Button
android:layout_gravity="center"
/>

</LinearLayout>

vì vậy bạn đang thiết kế Bố cục Tuyến tính để đặt tất cả nội dung của nó (TextView và Nút) ở trung tâm của nó và sau đó TextView và Nút được đặt so với tâm của Bố cục Tuyến tính


1

@jksschneider bùng nổ gần đúng. Đảm bảo rằng bạn chưa đặt bất kỳ gravitythành bố cục mẹ nào, sau đó đặt thành layout_gravity="center"chế độ xem hoặc bố cục của bạn.


1

Tôi đã trải nghiệm điều này khi làm việc với RelativeLayouts lồng nhau. Giải pháp của tôi cuối cùng trở nên đơn giản, nhưng nó có một chút lỗi đáng được lưu ý.

Bố cục của tôi được xác định bằng ...

android:layout_height="fill_parent"
android:layout_below="@id/someLayout
android:gravity="center"

... tuy nhiên, tôi không nghĩ rằng bố cục bên dưới cái này lại được đặt trên nó. Mọi thứ bên trong bố cục này đã được chuyển về phía dưới thay vì ở giữa. Đang thêm ...

android:layout_above="@id/bottomLayout"

... đã khắc phục sự cố của tôi.


0

đối với các chế độ xem ImageView hoặc những chế độ xem khác mà bố cục-trọng lực hoặc trọng lực không tồn tại, hãy sử dụng: android:layout_centerInParent="true"ở trẻ (tôi đã có bố cục tương đối với ImageView khi còn nhỏ).


0

Vấn đề là trọng lực của root (bố cục chính mà bạn lưu trữ các phần tử khác) không được thiết lập. Nếu bạn thay đổi nó thành trung tâm , trọng lực của các phần tử khác phải hoạt động tốt.


0

Dưới đây là mã để đặt Linearlayout của bạn ở cuối và đặt nội dung của nó ở trung tâm. Bạn phải sử dụng RelativeLayout để đặt Bố cục ở dưới cùng.

<RelativeLayout 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="50dp"
    android:background="#97611F"
    android:gravity="center_horizontal"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:text="View Saved Searches"
        android:textSize="15dp"
        android:textColor="#fff"
        android:gravity="center_vertical"
        android:visibility="visible" />
    <TextView
        android:layout_width="30dp"
        android:layout_height="24dp"
        android:text="12"
        android:textSize="12dp"
        android:textColor="#fff"
        android:gravity="center_horizontal"
        android:padding="1dp"
        android:visibility="visible" />
  </LinearLayout>  
</RelativeLayout>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.