LinearLayout: layout_gravity = "bottom" не работает на горизонтальном LinearLayout

Хорошо. Прежде всего, я искал весь интернет, но никто не имеет подобных проблем. Итак, все, что я хочу, состоит в том, чтобы иметь 3 textViews, нижний выровненный с экраном и с одинаковой шириной. Вот изображение, представляющее то, что я хочу:

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

И вот мой код:

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <TextView android:text="@string/help_1" android:layout_weight="0.33" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/mynicebg1" android:layout_gravity="bottom"/> <TextView android:text="@string/help_2" android:layout_weight="0.33" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/mynicebg2" android:layout_gravity="bottom"/> <TextView android:text="@string/help_3" android:layout_weight="0.33" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/mynicebg3" android:layout_gravity="bottom"/> </LinearLayout> </RelativeLayout> 

Ну, это работает, когда 3 textViews имеют одинаковую высоту, но когда их размер отличается, я получаю следующий результат:

проблема

Еще одно странное поведение: когда я устанавливаю layout_gravity самого большого текста в «center-vertical», я получаю следующий результат:

Первое обходное решение

Поэтому, очевидно, я сошел с ума и попробовал другие комбинации с вертикальной вертикалью, но ничего не сработало, как я хотел изначально:

Отчаяние

Итак, какие-нибудь советы о том, как это решить?

Solutions Collecting From Web of "LinearLayout: layout_gravity = "bottom" не работает на горизонтальном LinearLayout"

Правильный ответ

Все остальные ответы неверны. Важные моменты:

  1. Вам не нужен RelativeLayout . Вы можете сделать это с помощью только LinearLayout .
  2. (Не важно, но я думаю, вы не знали). Ваши веса не должны суммироваться до 1, вы можете просто установить их все на любое равное значение (например, 1).
  3. Критически важно, что вам нужен android:baselineAligned="false" . Я действительно нашел это, просмотрев источник 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:baselineAligned="false"> <TextView android:text="dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg dfg" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#eeffee" android:layout_gravity="bottom"/> <TextView android:text="asd asd asd asd asd asd asd asd asd asd" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#eeeeff" android:layout_gravity="bottom"/> <TextView android:text="qweoiu qweoiuqwe oiqwe qwoeiu qweoiu qweoiuq weoiuqw eoiquw eoiqwue oqiweu qowieu qowieu qoiweu qowieu qowieu qowieu qowieu qoiweu qowieu qoiwue " android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffeeee" android:layout_gravity="bottom"/> </LinearLayout> 

И как это выглядит:

Хороший линейный макет

ОК. Поэтому у меня была такая же проблема, но с кнопками переключения вместо текстовых просмотров. По какой-то причине, если один из элементов LinearLayout (Горизонтальный) имеет разную высоту, чем остальные виды в макете, и имеет тот же вес, что и другие, гравитация эффективно «игнорируется».

Мне удалось добиться желаемого поведения, обернув каждое представление внутри RelativeLayout и настроив android: gravity на относительный макет вместо android: layout_gravity на каждой кнопке. Я также переместил android: layout_weight от кнопки к относительной компоновке.

Поэтому вместо того, чтобы иметь:

 <LinearLayout ... > <ToggleButton ... android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1" android:layout_gravity="bottom"/> <ToggleButton ... android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1" android:layout_gravity="bottom"/> <ToggleButton ... android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1" android:layout_gravity="bottom"/> </LinearLayout> 

Что дает ту же проблему, что и сообщалось, я вместо этого сделал:

 <LinearLayout ... > <RelativeLayout ... android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="bottom" > <ToggleButton ... android:layout_height="wrap_content" android:layout_width="fill_parent" /> <RelativeLayout ... android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="bottom" > <ToggleButton ... android:layout_height="wrap_content" android:layout_width="fill_parent" /> <RelativeLayout ... android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="bottom" > <ToggleButton ... android:layout_height="wrap_content" android:layout_width="fill_parent" /> </LinearLayout> 

**РЕДАКТИРОВАТЬ:

Если это не все, добавьте флаг baselinealigned, как указано в одном из ответов ниже Timmmmm. Это лучший способ.

Использовать это

EDITED LAYOUT: Хорошо, я отредактировал его, а также добавил цвета и гравитацию, чтобы текстуры внизу имели равную высоту и ширину, а также выравнивали текст внизу и в центре каждого вида.

  <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:gravity="fill_vertical" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1.0" android:layout_gravity="fill_vertical" android:gravity="bottom|center" android:text="text1 jkjhh jhguk jvugy v ghjv kjhvygvusdioc jgytuayhashg hgyff" android:textColor="#000000" android:background="#FFFF00" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1.0" android:layout_gravity="fill_vertical" android:gravity="bottom|center" android:text="t2" android:textColor="#000000" android:background="#FF0000" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1.0" android:layout_gravity="fill_vertical" android:gravity="bottom|center" android:text="This is a long text. This is a long text. This is a long text. This is a long text.This is a long text. This is a long text. This is a long text." android:textColor="#000000" android:background="#00FF00" /> </LinearLayout> 

Он должен делать именно то, что вы просили.

Он использует LinearLayout внутри RelativeLayout, но иногда требуется, чтобы они вставляли их, чтобы получить то, что мы хотим. Добавьте еще несколько видов, которые могут потребоваться в относительном макете, и вы всегда будете иметь свои тексты внизу, пока последний ребенок в вашем RelativeLayout – это LinearLayout, как показано выше.

Если вы согласны с RelativeLayout вместо Linear, это будет делать трюк, я думаю:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/LinearLayout1" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/hello" android:id="@+id/TextView1" android:layout_above="@+id/TextView2" android:layout_alignLeft="@+id/TextView2"></TextView> <TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/hello" android:id="@+id/TextView2" android:layout_alignParentBottom="true"> </TextView> </RelativeLayout> 

Если вы пытаетесь сделать все три дочерних вида одинаковой высоты, затем измените высоту на «0», установите для android: weightSum из LinearLayout значение 3 и установите для android: layout_weight каждого вида значение 1.

То же, что и ответ Тимма, но вы также можете использовать android:gravity="bottom" для атрибута LinearLayout вместо android:layout_gravity="bottom" для каждого из 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="wrap_content" android:orientation="horizontal" android:gravity="bottom" android:baselineAligned="false"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:text="your text 1......" android:layout_weight="1"/> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:text="your text 2......" android:layout_weight="1"/> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:text="your text 3......" android:layout_weight="1"/> </LinearLayout>