Làm cách nào để căn chỉnh widget trong bố cục tuyến tính ngang của Android?


204

Đây là mã tôi đang sử dụng và nó không hoạt động:

<?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="horizontal">

    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:gravity="right">
    </TextView>

</LinearLayout>

Câu trả lời:


417

Cố gắng thêm trống Viewbên trong ngang LinearLayouttrước phần tử mà bạn muốn thấy đúng, ví dụ:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />                

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

11
Những công việc này! Nhưng ai có thể giải thích tại sao? Tôi hoàn toàn không thể hiểu được.
GMsoF

28
Chế độ xem trống đang cố gắng lấy dung lượng tối đa, chừa chỗ cho nút.
alcsan

14
Cho đến nay, đây là điều duy nhất phù hợp với tôi khi cố gắng có một vài nút ở bên trái và một nút cuối cùng ở bên phải. Nhưng nó cảm thấy như một hack đối với tôi. Có một cách "đúng" để làm điều này?
IcedDante

8
Điều này thật tuyệt! Nhưng tại sao trọng lực = "đúng" không hoạt động theo cách này ngay từ đầu? Tại sao nó cần sự giúp đỡ từ quan điểm khác này? Và làm thế nào là "đúng", nếu nó không, mà không có chế độ xem thêm?
từ

1
Điều này không hoạt động trong một bố cục giống như lưới - không có không gian trống. Giải pháp của Sherif elKhatib hoạt động.
cdonner

119

Không thay đổi trọng lực của linearLayout thành "phải" nếu bạn không muốn mọi thứ ở bên phải.

Thử:

  1. Thay đổi độ rộng của TextView thànhfill_parent
  2. Thay đổi trọng lực của TextView thànhright

Mã số:

    <TextView 
              android:text="TextView" 
              android:id="@+id/textView1"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"   
              android:gravity="right">
    </TextView>

1
cảm ơn vì điều này - đó là chiều rộng của fill_parent đã ném tôi đi
dldnh

2
Là bố trí tuyến tính thậm chí được thiết kế để đạt được điều này? Không nên chỉ sử dụng bố trí tương đối để đạt được điều này? Là giải pháp này không phải là một hack?
dùng2635088

điều này sẽ không hoạt động nếu bạn có nhiều điều khiển TextView trong linearLayout. Xem câu trả lời từ @alcsan
Felix

Đây phải là câu trả lời được chấp nhận. Cách tiếp cận này không sử dụng bất kỳ chế độ xem bổ sung nào và quan trọng hơn, nó không sử dụng layout_ weight cho thấy hiệu suất giảm đáng kể.
Bài giảng

android:layout_weight = "1"sát cánh bên nhau android:gravity="right", nên làm thủ thuật.
Vassilis

63

Để bổ sung cho câu trả lời của alcsan, bạn có thể sử dụng Spacekể từ API 14 (Android 4.0 ICE_CREAM_SANDWICH), tài liệu ở đây .

Không gian là một lớp con Xem nhẹ có thể được sử dụng để tạo khoảng cách giữa các thành phần trong bố cục mục đích chung.

<?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="horizontal" >

    <Space
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <TextView
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="TextView"
        android:gravity="right" />

</LinearLayout>

Đối với các ứng dụng hỗ trợ các cấp API dưới 14, có android.support.v4.widget.SpaceThư viện hỗ trợ Android r22.1.0.


Quan trọng là bạn cần đặt
layout_ weight

Hoạt động hoàn hảo! Giữ nguyên chiều rộng của mỗi phần tử.
phatmann

Những công việc này. Wow, sự xấu xí của Android không bao giờ hết làm tôi ngạc nhiên
Chris Neve

31

Với bố cục tuyến tính

<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/select_car_book_tabbar"
        android:gravity="right" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:src="@drawable/my_booking_icon" />
    </LinearLayout>

nhập mô tả hình ảnh ở đây

với FrameLayout

<FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/select_car_book_tabbar">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|right"
            android:src="@drawable/my_booking_icon" />
    </FrameLayout>

với RelativeLayout

<RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/select_car_book_tabbar">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerInParent="true"
            android:src="@drawable/my_booking_icon" />
    </RelativeLayout>

21

thiết lập chế độ xem layout_weight="1"sẽ thực hiện các mẹo.!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
    android:id="@+id/textView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

<RadioButton
    android:id="@+id/radioButton1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>


2
Một giải pháp đơn giản như vậy +1
Alex

1
Nếu ai đó vẫn đang tìm kiếm, đây là giải pháp phù hợp :)
passatgt

Đây là Phép thuật! Làm thế nào bạn tìm ra nó?
andreikashin

@andreikashin, Hãy xem xét một cuộc bỏ phiếu nếu nó giúp. Cảm ơn.
Saad Mahmud

13

Thêm vào tuyến tính android:gravity="right". Giả sử TextViewlayout_width="wrap_content"


2
Ông đặc biệt nói rằng sắp xếp một thành phần duy nhất bên trong linearLayout. Không phải chính bố cục tuyến tính: chính bố cục được đặt thành fill_parent.
RichieHH


4

Tôi đã thực hiện nó bằng cách dễ nhất:

Chỉ cần lấy một RelativeLayout và đưa bạn trẻ nhìn vào nó, mà bạn muốn đặt ở ngay phía.

    <LinearLayout
        android:id="@+id/llMain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#f5f4f4"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingBottom="20dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:paddingTop="20dp">

        <ImageView
            android:id="@+id/ivOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher" />


        <TextView
            android:id="@+id/txtOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="Hiren"
            android:textAppearance="@android:style/TextAppearance.Medium"
            android:textColor="@android:color/black" />

        <RelativeLayout
            android:id="@+id/rlRight"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right">


            <ImageView
                android:id="@+id/ivRight"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:src="@drawable/ic_launcher" />

        </RelativeLayout>
    </LinearLayout>

Hy vọng nó sẽ giúp bạn.


3

Bạn nên sử dụng RelativeLayout và chỉ cần kéo chúng cho đến khi nó trông ổn :)

    <ImageView
        android:id="@+id/button_info"
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="10dp"
        android:contentDescription="@string/pizza"
        android:src="@drawable/header_info_button" />

</RelativeLayout>

2
"kéo chúng" không được khuyến nghị cho màn hình đa độ phân giải
Moses Aprico

3

linear layoutvới layout_width="fill_parent"và cả widget có cùng layout width+ gravity as rightsẽ căn chỉnh nó ở bên phải.

Tôi đang sử dụng 2 TextViewgiây trong ví dụ sau, topicTitlebên trái và topicQuestionsbên phải.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="20dp"
        android:orientation="horizontal">

    <TextView
        android:id="@+id/topicTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/topicQuestions"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:textSize="18sp"
        android:textStyle="bold" />
    </LinearLayout>

</RelativeLayout>

Đầu ra


2

Cố gắng thay đổi layout_creen thành android:layout_width="match_parent"gravity:"right"căn chỉnh văn bản bên trong layout_creen và nếu bạn chọn bọc nội dung thì nó không có nơi để đi, nhưng nếu bạn chọn khớp cha mẹ thì nó có thể đi bên phải.


2

Không cần sử dụng bất kỳ chế độ xem hoặc phần tử bổ sung nào:

// thật dễ dàng và đơn giản

<LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
>

// đây là căn lề trái

<TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="No. of Travellers"
      android:textColor="#000000"
      android:layout_weight="1"
      android:textStyle="bold"
      android:textAlignment="textStart"
      android:gravity="start" />

// đây là căn lề phải

<TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Done"
      android:textStyle="bold"
      android:textColor="@color/colorPrimary"
      android:layout_weight="1"
      android:textAlignment="textEnd"
      android:gravity="end" />

</LinearLayout>

0

Trong trường hợp với TextView:

<TextView 
    android:text="TextView" 
    android:id="@+id/textView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"   
    android:gravity="right"
    android:textAlignment="gravity">    
</TextView>

0

Thêm chế độ xem hơi khó khăn và nó bao gồm tất cả chiều rộng màn hình như thế này:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_weight="1" />                

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Hãy thử mã này:

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Create Account"/>

</LinearLayout>

-1

Đây là một mẫu. chìa khóa để sắp xếp như sau

android:layout_width="0dp"
android:layout_weight="1"

Mã hoàn chỉnh

<?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="wrap_content"
    android:orientation="horizontal"
    android:padding="5dp">

    <TextView
        android:id="@+id/categoryName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="abcd" />

    <TextView
        android:id="@+id/spareName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="efgh" />

</LinearLayout>

nhập mô tả hình ảnh ở đây


-1

Sử dụng match_parent và trọng lực để đặt văn bản TextView sang phải, như thế này:

<?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="horizontal">

    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right">
    </TextView>

</LinearLayout>

-2

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="horizontal" 
    android:gravity="right" >



    <TextView android:text="TextView" android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </TextView>

</LinearLayout>
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.