LinearLayout поместит ребенка на правой стороне

Я пытаюсь иметь текстовое представление и кнопку в линейном макете с горизонтальной ориентацией. Текстовое представление должно появиться в начале, а кнопка должна появиться в конце. Я думал, что придание силы тяжести кнопке поможет, но кнопки не движутся вправо. Я думаю, стоит ли мне использовать относительное расположение?

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

    <TextView
        android:id="@+id/productPriceTextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Rs 3579.0" 
        />

    <Button
        android:id="@+id/buyNowButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="Buy Now" />
<\/LinearLayout>

7 ответов

Решение

Мой путь (используя RelativeLayout):

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >
    <TextView
        android:id="@+id/productPriceTextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="Rs 3579.0"
    />
    <Button
        android:id="@+id/buyNowButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="Buy Now"
    />
</RelativeLayout>

Посмотрите, как я явно выровняю TextView с левой стороны родителя и кнопку с правой стороны родителя

Затем вы можете центрировать TextView вертикально в RelativeLayout, установив:

android:layout_centerVertical="true"

в самом TextView

Попробуйте ниже xml:

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

    <TextView
        android:id="@+id/productPriceTextView1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:text="Rs 3579.0"
        />

    <Button
        android:id="@+id/buyNowButton1"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="Buy Now" />
</LinearLayout>

Есть более чистый способ сделать это, используя LinearLayout: просто присвойте левому элементу ширину 0 и вес 1 и установите ширину правого элемента в wrap_content. И это все!

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

    <TextView
        android:id="@+id/productPriceTextView1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Rs 3579.0" 
        />

    <Button
        android:id="@+id/buyNowButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Buy Now" />
</LinearLayout>

Используйте этот макет вместо..

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

<TextView
android:id="@+id/productPriceTextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rs 3579.0"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />



<Button
android:id="@+id/buyNowButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Buy Now"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />

</RelativeLayout>

Есть два подхода:

1) Вы можете использовать RelativeLayout в котором вы можете перетащить Button где вы хотите..

2) Вы можете использовать свойство веса для LinearLayout,

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

<TextView
    android:id="@+id/productPriceTextView1"
    android:layout_width="0dp"
    android:layout_weight="0.8"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:text="Rs 3579.0"
    />

<Button
    android:id="@+id/buyNowButton1"
    android:layout_width="0dp"
    android:layout_weight="0.2"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="Buy Now" />
</LinearLayout>

Другое простое решение, которое не основано на использовании RelativeLayout имеет пустой view между обоими элементами, используя layout_weight чтобы убедиться, что он заполняет пустое пространство.

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

  <TextView
      android:id="@+id/productPriceTextView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Rs 3579.0"/>

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

  <Button
      android:id="@+id/buyNowButton1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="right"
      android:text="Buy Now" />
</LinearLayout>

Таким образом, вы можете достичь того, что вы хотите, только используя LinearLayoutТеперь я не уверен, что это более эффективно, чем использование RelativeLayout, Но для меня всегда кажется излишним излишним стремление к родственнику в такой простой раскладке.

Использование android:layout_gravity="end" на ваш линейный макет, чтобы переместить все элементы вправо

Просто добавьте пустой вид с шириной 0dp и 1 весом

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

    <TextView
        android:id="@+id/productPriceTextView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Rs 3579.0" 
        />
     <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <Button
        android:id="@+id/buyNowButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
        android:text="Buy Now" />
</LinearLayout>
Другие вопросы по тегам