Если существует несколько видов, охватывающих LinearLayout
, то layout_weight
присваивает им пропорциональный размер. Представление с большим значением layout_weight
«весит» больше, поэтому оно получает большее пространство.
Вот изображение, чтобы прояснить ситуацию.
Теория
Термин «вес макета» связан с понятием средневзвешенное значение в математике. Это как в классе колледжа, где домашнее задание стоит 30%, посещаемость - 10%, промежуточный - 20%, а финальный - 40%. Ваши оценки по этим частям, при взвешивании вместе, дают вам общую оценку.
То же самое для веса макета. Views
в горизонтальном LinearLayout
может занимать определенный процент от общей ширины. (Или процент от высоты для вертикали LinearLayout
.)
Макет
LinearLayout
, который вы используете, будет выглядеть примерно так:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- list of subviews -->
</LinearLayout>
Обратите внимание, что вы должны использовать layout_width="match_parent"
для LinearLayout
. Если вы используете wrap_content
, то это не сработает. Также обратите внимание, что layout_weight
не работает для представлений в RelativeLayouts (см. здесь и здесь для ответов SO, касающихся этой проблемы).
Просмотров
Каждый горизонтальный вид LinearLayout
выглядит примерно так:
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
Обратите внимание, что вам нужно использовать layout_width="0dp"
вместе с layout_weight="1"
. Забывание этого вызывает много новых проблем пользователей. (См. в этой статье , чтобы узнать о других результатах, которые вы можете получить, не устанавливая ширину равной 0.) Если ваши представления находятся в по вертикали LinearLayout
, тогда вы должны использовать Конечно.
В приведенном выше примере Button
я установил вес на 1, но вы можете использовать любое число. Только общее значение имеет значение. Вы можете видеть в трех рядах кнопок на первом изображении, которое я разместил, все цифры разные, но поскольку пропорции одинаковы, взвешенная ширина не меняется в каждой строке. Некоторым людям нравится использовать десятичные числа, сумма которых равна 1, чтобы в сложной компоновке было ясно, каков вес каждой части.
Последнее замечание. Если у вас много вложенных макетов, использующих layout_weight
, это может сказаться на производительности.
Extra
Вот XML-макет для верхнего изображения:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="2" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="1" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:text="10" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="20"
android:text="20" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="10"
android:text="10" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android:layout_weight="
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:text=".25" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".50"
android:text=".50" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".25"
android:text=".25" />
</LinearLayout>
</LinearLayout>