Как правильно выровнять виджет в горизонтальном линейном макете Android?


206

Это код, который я использую, и он не работает:

<?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>

Ответы:


419

Попробуйте добавить пустой Viewвнутри горизонтали LinearLayoutперед элементом, который вы хотите видеть справа, например:

<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>

12
Это работает! Но кто-нибудь может объяснить, почему? Я не мог полностью понять.
GMsoF

29
Empty View пытается занять максимальное количество места, оставляя место для кнопки.
alcsan

14
Пока что это единственное, что работает для меня, когда я пытаюсь иметь несколько кнопок слева и одну заключительную кнопку справа. Но это похоже на хак для меня. Есть ли «правильный» способ сделать это?
IcedDante

8
Это круто! Но почему сила тяжести = "правильно" не работает таким образом с самого начала? Почему ему нужна помощь с другой точки зрения? И как это «правильно», если это не так, без лишнего взгляда?
afrish

1
Это не работает в сетчатом макете - там нет пустого пространства. Решение Шерифа ЭльХатиба работает.
cdonner

119

Не меняйте гравитацию LinearLayout на «право», если вы не хотите, чтобы все было справа.

Пытаться:

  1. Изменить ширину TextView наfill_parent
  2. Изменить гравитацию TextView наright

Код:

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

1
спасибо за это - это была ширина fill_parent, которая отбрасывала меня
dldnh

2
Линейный макет даже предназначен для этого? Не следует ли просто использовать относительный макет для достижения этой цели? Разве это решение не взломать?
user2635088

это не будет работать, если у вас есть несколько элементов управления TextView в LinearLayout. Смотрите ответ @alcsan
Феликс

Это должен быть принятый ответ. Этот подход не использует никаких дополнительных представлений и, что более важно, он не использует layout_weight, который значительно снижает производительность.
Сермилион,

android:layout_weight = "1"бок о бок android:gravity="right", должен сделать свое дело.
Василис

63

В качестве дополнения к ответу alcsan, вы можете использовать Spaceначиная с API 14 (Android 4.0 ICE_CREAM_SANDWICH), документ здесь .

Space - это легкий подкласс View, который можно использовать для создания промежутков между компонентами в макетах общего назначения.

<?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>

Для приложений, поддерживающих уровни API ниже 14, существует android.support.v4.widget.SpaceAndroid Support Library r22.1.0.


Важно то, что вам нужно установить layout_weight = "1"
code4j

Работает отлично! Сохраняет ширину каждого элемента.
phatmann

Это работает. Ух ты, уродство Android не перестает меня удивлять
Крис Нев

31

С линейной компоновкой

<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>

введите описание изображения здесь

с 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>

с 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

установка вида layout_weight="1"сделает свое дело.

<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
Такое простое решение +1
Алекс

1
Если кто-то все еще ищет, это правильное решение :)
passatgt

Это магия! Как ты это узнал?
Андрейкашин

@andreikashin, рассмотрите возможность голосования, если это помогло. Спасибо.
Саад Махмуд

13

Добавьте android:gravity="right"к LinearLayout. Предполагая, что TextViewимеетlayout_width="wrap_content"


2
Он специально сказал, чтобы выровнять один компонент внутри LinearLayout. Не сам линейный макет: сам макет установлен в fill_parent.
RichieHH


4

Я сделал это самым простым способом:

Просто возьмите один RelativeLayout и поместите в него вид вашего ребенка , который вы хотите разместить справа .

    <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>

Надеюсь, это поможет вам.


3

Вы должны использовать RelativeLayout и просто перетаскивать их, пока он не выглядит хорошо :)

    <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
«перетаскивать их» не рекомендуется для экрана с несколькими разрешениями
Moses Aprico

3

linear layoutс, layout_width="fill_parent"а также виджет с таким же layout width+ gravity as rightбудет выравнивать его вправо.

Я использую 2 TextViewс в следующем примере, topicTitleслева и topicQuestionsсправа.

<?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>

Вывод


2

Попробуйте изменить layout_width на, android:layout_width="match_parent"потому что gravity:"right"выравнивает текст внутри layout_width, и если вы выбираете перенос содержимого, ему некуда идти, но если вы выберете match parent, он может перейти вправо.


2

Нет необходимости использовать какой-либо дополнительный вид или элемент:

// это так легко и просто

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

// это выравнивание по левому краю

<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" />

// это правильное выравнивание

<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

В случае с 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

Добавление вида немного сложнее, и оно охватывает всю ширину экрана следующим образом:

<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
    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

Вот образец. ключ к организации заключается в следующем

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

Полный код

<?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>

введите описание изображения здесь


-1

Используйте match_parent и gravity, чтобы установить текст TextView вправо, например так:

<?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

Попробуй это..

<?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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.