Layout_gravity не работает в горизонтальной линейной компоновке

Я пытаюсь использовать layout_gravity в горизонтальном linear layout. Но, похоже, это не работает. Я не хочу использовать relative layout или любой другой макет. Я хочу знать, почему он не работает с linear layout. Раньше я использовал layout_gravity в vertical линейных макетах, и он работал так, как я ожидал.

<LinearLayout
    android:id="@+id/shata"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/title_textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/black"
        android:text="shata1"
        android:textAppearance="?android:attr/textAppearanceMedium"
        />
    <TextView
        android:id="@+id/map_imageview"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="shata2"/>    
</LinearLayout>

Как вы можете видеть, линейный макет имеет orientation=horizontal и width=match_parent (он находится только внутри корневого макета). Но оба TextViews отображаются слева от LinearLayout, хотя я дал их layout_gravity=center и layout_gravity=right соответственно.

Ответ 1

Короткий ответ: если у вас есть горизонтальный LinearLayout, то каждый ребенок может иметь только layout_gravity значения top, bottom и center.

Причина этого заключается в том, что вы уже сказали LinearLayout выровнять каждый дочерний объект по горизонтали, слева направо в указанном вами порядке, что означает, что он позволяет указывать вертикальное выравнивание каждого дочернего элемента в параметр layout_gravity, и наоборот, когда ваш LinearLayout является вертикальным.

Там есть хорошая ссылка, объясняющая, как различные тяжести работают здесь.

Ответ 2

Если вы хотите, чтобы ваш ребенок рассматривался по центру, вам просто нужно придать весу линейного макета для детей. На линейном макете установите следующее:

android:gravity="center"

Надеюсь, я правильно понял ваш вопрос.

Ответ 3

В качестве дополнения к отклику Matt Taylor вы можете указать соотношение размеров элементов внутри макета, используя свойство layout_weight. Подробнее см. .

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

<LinearLayout
    android:id="@+id/shata"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <TextView
        android:layout_width="0"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <TextView
        android:layout_width="0"
        android:layout_height="match_parent"
        android:layout_weight="1"/>    
</LinearLayout>

Итак, в этом примере

  • первый элемент выглядит как layout_gravity="left"
  • второй элемент выглядит как layout_gravity="center"
  • третий элемент выглядит как layout_gravity="right"

Ответ 4

вы можете разделить макет на 3 части, затем в правой части поместите "shata2" в центральной части, поставьте "shata1", а левая часть - прозрачным.

<LinearLayout
    android:id="@+id/shata"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

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

    <TextView
        android:id="@+id/title_textview"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center|top"
        android:layout_weight="1"
        android:text="shata1"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#111" />

    <TextView
        android:id="@+id/map_imageview"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="right"
        android:gravity="right"
        android:text="shata2"
        android:textAppearance="?android:attr/textAppearanceMedium" />



</LinearLayout>

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

Ответ 5

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<TextView
    style="@style/Base.TextAppearance.AppCompat.Headline"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Blankets &amp;  Carpets" />

<ListView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/list_home_feature"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="30dp"
    android:layout_marginRight="10dp">

</ListView>

</LinearLayout>

Ответ 6

Один способ создания трех дочерних элементов в горизонтальном linearlayout будет (проверен):

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

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

        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_gravity="center_horizontal"
            android:layout_height="wrap_content"/>

            <TextView
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="" />