2011-12-17 28 views
33

Tôi có một RelativeLayout chứa một cặp các nút cạnh nhau, mà tôi muốn được căn giữa trong bố cục. Tôi chỉ có thể đặt các nút trong một LinearLayout và trung tâm trong RelativeLayout, nhưng tôi muốn giữ cho xml của tôi càng sạch càng tốt.Trung tâm nhiều mục trong RelativeLayout mà không đặt chúng trong vùng chứa?

Đây là những gì tôi đã cố gắng, điều này chỉ đặt nút "áp dụng" ở trung tâm và "undo" nút bên trái của nó:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="15sp"> 
    <TextView 
    android:id="@+id/instructions" 
    android:text="@string/instructions" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="15sp" 
    android:layout_centerHorizontal="true" 
    /> 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/apply" 
    android:textSize="20sp" 
    android:layout_below="@id/instructions" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="@string/undo" 
    android:textSize="20sp" 
    android:layout_toLeftOf="@id/apply" 
    android:layout_below="@id/instructions" 
    /> 
</RelativeLayout> 

Trả lời

57

android:gravity sẽ căn chỉnh nội dung bên trong view hoặc layout được sử dụng.

android:layout_gravity sẽ căn chỉnh view hoặc layout bên trong bố mẹ.

Vì vậy, thêm

android:gravity="center" 

để RelativeLayout bạn nên làm các trick ...

Như thế này:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:layout_marginTop="15sp"> 

</RelativeLayout> 
+0

Bạn có thể bố trí ví dụ không? Tôi không thấy làm thế nào điều này có thể làm việc bởi vì bạn phải đặt một nút bên trái của thứ hai và cách khác xung quanh, đó là một phụ thuộc vòng tròn. Mà ném một IllegalStateException trong một RelativeLayout. –

+0

Tự kiểm tra ... chỉ cần sử dụng mã trong câu hỏi và thêm dòng như tôi đã nói ... – BrainCrash

+0

Ồ, tôi hiểu, tôi đã bỏ lỡ "trung tâm trong RelativeLayout" là cả dọc và ngang - trái với trung tâm nằm ngang bên dưới chế độ xem văn bản. Điều này có ý nghĩa sau đó. –

2

LinearLayout là một lựa chọn tốt. Khác hơn là có các tùy chọn như tạo ra một cái nhìn vô hình và trung tâm đó và sau đó align nút trái bên trái nó và phải ở bên phải của nó. NHƯNG những người chỉ là làm việc xung quanh.

+0

Vâng, đó là giải pháp xấu, nhưng đó là cách tốt nhất mà tôi đã tìm thấy. Hoặc tạo ra khung nhìn spacer đó, hoặc tạo ra một RelativeLayout/LinearLayout có chứa - vì vậy một trong hai cách View khác cần phải được tăng cao, nhưng điều này tránh được chi phí của việc có các ViewGroup lồng nhau. –

+0

@havexz Xin lỗi vì downvote, vì tôi thực sự đã kết hợp một layout riêng biệt để có được một trung tâm mà tôi cần. Tôi đã quá vội vàng để loại bỏ câu trả lời của bạn b/c nó vấn đề cụ thể ở đây là nhiều hơn "sạch" giải quyết bằng câu trả lời của BrianCrash. Tuy nhiên khi tôi đẩy giải pháp đó thêm một chút thì nó vẫn chưa đủ. Nó sẽ không cho phép tôi hoàn tác hay upvote? – samosaris

+0

@SamusArin Để hoàn tác một phiếu bầu, hãy nhấp lại vào biểu tượng bỏ phiếu. – mindriot

5
android:layout_gravity="center" 

sẽ gần như cung cấp những gì bạn đang tìm kiếm.

+0

Omg, bạn đã trả lời chính xác thời điểm này giống như BrianCrash. Tôi downvoted b/c Tôi nghĩ rằng bạn đã sao chép câu trả lời của mình. Xin lỗi người đàn ông (Tôi sẽ cố gắng sửa chữa downvote)! – samosaris

+0

Ok, tất cả đều tốt hơn (nhờ chỉnh sửa của Jean). – samosaris

4

Đây là một sự kết hợp của các câu trả lời của trên mà giải quyết tình hình cụ thể của tôi :

Căn giữa hai nhãn riêng biệt trong bố cục cũng bao gồm ở vị trí bên trái nhất của cùng một bố cục (nút, nhãn, nhãn, từ trái sang phải, nơi các nhãn được căn giữa so với bố cục chứa tất cả ba chế độ xem - tức là nút không đẩy nhãn ra khỏi chính giữa) .

Tôi đã giải quyết vấn đề này bằng cách lồng hai RelativeLayout, trong đó bố trí ngoài cùng nhất bao gồm nút và một Inner-RelativeLayout.

Inner-RelativeLayout chứa hai nhãn văn bản (TextView's).

Dưới đây là một đoạn cung cấp các chi tiết về cách định tâm và các công cụ bố trí khác đã được thực hiện:

see: RelativeLayout Gravity not applied?Gravity and layout_gravity on Android cho sự khác biệt của giữa trọng lực và layout_gravity.

Tinh chỉnh paddingLeft trên nút btn_button1 để thấy rằng TextView không di chuyển.

Tôi rất vội vàng khi nghĩ rằng chỉ cần b/c đề xuất của bạn không giải quyết được câu hỏi chính xác đang được hỏi, rằng họ giúp giải quyết các tình huống rất giống nhau (câu trả lời ở đây giải quyết Tôi đã cố gắng upvoting, nhưng nó sẽ không cho phép tôi trừ khi tôi chỉnh sửa câu trả lời, mà tôi không muốn làm.)

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rl_outer" 
    android:layout_width="fill_parent" 
    android:layout_height="50dip" 
    android:background="#FF0000FF"> 

    <Button 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/btn_button1" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:background="#FF00FF00" 
    android:text="&lt;" 
    android:textSize="20sp" 
    android:paddingLeft="40dip"/> 

    <RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rl_inner" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:background="#FFFF00FF"   
    android:layout_centerInParent="true" 
    android:gravity="center">  

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tv_text1" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:background="#FF505050" 
     android:textSize="20sp" 
     android:textColor="#FFFFFFFF" 
     android:text="Complaint #" 
     android:gravity="center"/>  

    <TextView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tv_text2" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:background="#FF505050" 
     android:textSize="20sp" 
     android:textColor="#FFFFFFFF" 
     android:layout_toRightOf="@id/tv_text1" 
     android:gravity="center"/> 

    </RelativeLayout> 
</RelativeLayout> 
+1

android: layout_centerInParent = "true" đã thực hiện thủ thuật –

8

Đây là phần mở rộng câu trả lời của BrainCrash. Nó là một tùy chọn không lồng nhau mà nhóm và trung tâm cả ba chiều ngang và theo chiều dọc. Ngoài ra, nó có TextView trên cùng và đặt nó theo chiều ngang trên cả hai nút. Nếu muốn, bạn có thể căn giữa văn bản trong TextView với android: gravity = "center". Tôi cũng đã loại bỏ các lề, thêm màu và đặt chiều cao RelativeLayout thành fill_parent để làm nổi bật bố cục. Thử nghiệm trên API 11.

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" 
    android:background="@android:color/black" 
    > 
    <TextView 
    android:id="@+id/instructions" 
    android:text="TEST" 
    android:textSize="20sp" 
    android:background="@android:color/darker_gray" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_alignLeft="@+id/undo" 
    android:layout_alignRight="@+id/apply" 
    android:gravity="center" 
    /> 
    <Button 
    android:id="@+id/apply" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="APPLY" 
    android:textSize="20sp" 
    android:layout_below="@id/instructions" 
    /> 
    <Button 
    android:id="@+id/undo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:text="UNDO" 
    android:textSize="20sp" 
    android:layout_toLeftOf="@id/apply" 
    android:layout_below="@id/instructions" 
    /> 
</RelativeLayout> 
Các vấn đề liên quan