Вот мой код компоновки;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
<LinearLayout android:id="@+id/LinearLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom">
<EditText android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
<Button android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</LinearLayout>
То, на что это похоже, находится слева, и я хочу, чтобы это выглядело справа.
Очевидный ответ - установить TextView на fill_parent по высоте, но это не оставляет места для кнопки или поля ввода.
По сути, проблема в том, что я хочу, чтобы кнопка отправки и текстовая запись были фиксированной высоты внизу, а текстовое представление заполняло оставшееся пространство. Аналогично, в горизонтальном линейном макете я хочу, чтобы кнопка отправки обернула свое содержимое, а текстовая запись заполнила оставшееся пространство.
Если первый элемент в линейном макете сообщается fill_parent, он делает именно это, не оставляя места для других элементов. Как получить элемент, который находится сначала в линейном макете, чтобы заполнить все пространство, кроме минимума, необходимого для остальных элементов в макете?
Относительные макеты действительно были ответом:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</TextView>
<RelativeLayout
android:id="@+id/InnerRelativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<EditText
android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_toLeftOf="@id/Button"
android:layout_height="wrap_content">
</EditText>
</RelativeLayout>
</RelativeLayout>
Ответы:
Современный способ сделать это - использовать ConstraintLayout и ограничить нижнюю часть представления нижней частью ConstraintLayout с помощью
app:layout_constraintBottom_toBottomOf="parent"
В приведенном ниже примере создается FloatingActionButton, который будет выровнен по концу и по нижней части экрана.
Для справки я сохраню свой старый ответ.
До введения ConstraintLayout ответ был относительным .
Если у вас есть относительный макет, который занимает весь экран, вы можете использовать его,
android:layout_alignParentBottom
чтобы переместить кнопку в нижнюю часть экрана.Если ваши виды внизу не отображаются в относительном макете, то, возможно, макет выше занимает все пространство. В этом случае вы можете поместить вид, который должен быть внизу, сначала в свой файл макета и расположить остальную часть макета выше видов с помощью
android:layout_above
. Это позволяет нижнему виду занимать столько места, сколько ему нужно, а остальная часть макета может занимать всю остальную часть экрана.источник
android:layout_above
?that RelativeLayout
занимает много памяти и его следует избегать, когда это возможно.В a
ScrollView
это не работает, так какRelativeLayout
тогда они перекрывают все, что находитсяScrollView
внизу страницы.Я исправил это с помощью динамически растягивающегося
FrameLayout
:источник
Вы можете сохранить исходный линейный макет, вложив относительный макет в линейный макет:
источник
Ответ выше (автор Janusz) вполне корректен, но лично я не чувствую себя на 100% комфортно с RelativeLayouts, поэтому я предпочитаю ввести «заполнитель», пустой TextView, например:
перед элементом, который должен быть в нижней части экрана.
источник
Вы также можете сделать это с помощью LinearLayout или ScrollView. Иногда это легче реализовать, чем RelativeLayout. Единственное, что вам нужно сделать, это добавить следующий вид перед представлениями, которые вы хотите выровнять по нижней части экрана:
Это создает пустое представление, заполняя пустое пространство и выдвигая следующие представления внизу экрана.
источник
Это тоже работает.
источник
1. Используйте
ConstraintLayout
в своем корневом макетеИ установите
app:layout_constraintBottom_toBottomOf="parent"
«Макет» внизу экрана:2. Используйте
FrameLayout
в вашем корневом макетеПросто установите
android:layout_gravity="bottom"
в вашем макете3. Используйте
LinearLayout
в своем корневом макете (android:orientation="vertical"
)(1) Установите макет
android:layout_weight="1"
в верхней части вашего макета(2) Установите ребенка
LinearLayout
дляandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
Основной атрибут
ndroid:gravity="bottom"
, пусть дочерний View в нижней части Layout.4. Используйте
RelativeLayout
в корневом макетеИ установите,
android:layout_alignParentBottom="true"
чтобы макет внизу экранаВывод
источник
Следуя элегантному решению Тимора , я обнаружил, что следующее создает вертикальную заливку в вертикальной LinearLayout и горизонтальную заливку в горизонтальной LinearLayout:
источник
Вам даже не нужно вкладывать второй
relative
макет в первый. Просто используйтеandroid:layout_alignParentBottom="true"
в кнопку и EditText .источник
Если вы не хотите вносить много изменений, вы можете просто добавить:
для TextView , имеющего идентификатор в качестве
@+id/TextView
т.е.источник
Создание верхнего и нижнего колонтитула , вот пример:
Макет XML
Скриншот
источник
Используйте код ниже. Совместите кнопку с кнопкой. Работает.
источник
Для такого случая всегда используйте RelativeLayouts. LinearLayout не предназначен для такого использования.
источник
Используйте
android:layout_alignParentBottom="true"
в своем<RelativeLayout>
.Это определенно поможет.
источник
Если у вас есть такая иерархия:
Сначала примените
android:fillViewport="true"
к,ScrollView
а затем применитеandroid:layout_alignParentBottom="true"
кLinearLayout
.Это сработало для меня отлично.
источник
Вы можете просто дать свой вид сверху ребенка (в TextView @ + код / TextView ) атрибут:
android:layout_weight="1"
.Это заставит все остальные элементы под ним снизу.
источник
Это также можно сделать с помощью линейного макета.
Просто укажите Height = 0dp и weight = 1 для макета выше и тот, который вы хотите внизу. Просто напишите высоту = оберните содержимое и не вес.
Он обеспечивает перенос содержимого для макета (тот, который содержит ваш текст редактирования и кнопку), а затем тот, который имеет вес, занимает остальную часть макета.
Я обнаружил это случайно.
источник
Я использовал решение, опубликованное Janusz, но я добавил заполнение к последнему представлению, так как верхняя часть моего макета была ScrollView.
ScrollView будет частично скрыт по мере роста с содержанием. Использование
android:paddingBottom
в последнем представлении помогает показать весь контент в ScrollView.источник