Что означает android: layout weight?
Я не понимаю, как использовать этот атрибут. Кто может сказать мне больше об этом?
13 ответов:
С
layout_weight
вы можете указать соотношение размеров между несколькими видами. Например, у вас естьMapView
иtable
который должен показать некоторую дополнительную информацию к карте. Карта должна использовать 3/4 экрана, а таблица должна использовать 1/4 экрана. Тогда вы установитеlayout_weight
наmap
в 3 иlayout_weight
наtable
к 1.чтобы заставить его работать, вы также должны установить высоту или ширину (в зависимости от вашей ориентации) в 0px.
в двух словах
layout_weight
указывает, сколько дополнительного пространства в макете должно быть выделено для представления.LinearLayout поддерживает присвоение веса отдельным детям. Этот атрибут присваивает "значения" значение и позволяет ему расширяться, чтобы заполнить любое оставшееся пространство в Родительском представлении. Вес представлений по умолчанию равен нулю.
расчет, чтобы назначить любое оставшееся пространство между дочерними
В общем, формула это:
пространство, назначенное ребенку = (индивидуальный вес ребенка) / (сумма веса каждого ребенка в линейной компоновке)
Пример 1
если есть три текстовых поля и два из них объявляют вес 1, в то время как третий не дается вес (0), то оставшееся пространство присваивается следующим образом:
1-й текстовое поле = 1/(1+1+0)
2-й текстовое поле = 1/(1+1+0)
3-е текстовое поле = 0/(1+1+0)
Пример 2
допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Метка не имеет
layout_weight
указано, поэтому он занимает минимальное пространство, необходимое для визуализации. Еслиlayout_weight
для каждого из двух элементов редактирования текста установлено значение 1, оставшаяся ширина в Родительском макете будет разделена поровну между ними (потому что мы утверждаем, что они одинаково важны).расчет:
1-й метки = 0/(0+1+1)
2-й текстовое поле = 1/(0+1+1)
3-й текстовое поле = 1/(0+1+1)
если вместо этого в первом текстовом поле есть
layout_weight
1, а второе текстовое поле имеетlayout_weight
из 2, то одна треть оставшегося пространства будет отдана первому, а две трети-второму (потому что мы утверждаем, что второй более важен).расчет:
1-й метки = 0/(0+1+2)
2-й текстовое поле = 1/(0+1+2)
3-й текстовое поле = 2/(0+1+2)
добавляя к другим ответам, самое главное, чтобы это сработало, - установить ширину макета (или высоту) в 0px
android:layout_width="0px"
иначе вы увидите мусор
если есть несколько видов, охватывающих
LinearLayout
, потомlayout_weight
дает им каждый пропорциональный размер. Вид с большимlayout_weight
значение "весит" больше, поэтому он получает больше пространства.вот изображение, чтобы сделать вещи более ясно.
теория
термин вес макета связан с понятием средневзвешенная в математике. Это как в классе колледжа, где домашнее задание стоит 30%, посещаемость стоит 10%, промежуточный экзамен стоит 20%, а финал стоит 40%. Ваши оценки для этих частей, когда взвешены вместе, дают вам общую оценку.
это то же самое для весового макета. Элемент
Views
горизонтальнаяLinearLayout
каждый может взять определенный процент от общей ширины. (Или процент высоты для вертикалиLinearLayout
.)Расположение
The
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 (см. здесь и здесь для так ответов, связанных с этим вопросом).Мнения
каждый вид по горизонтали
LinearLayout
выглядит так:<Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" />
обратите внимание, что вам нужно использовать
layout_width="0dp"
вместе сlayout_weight="1"
. Забывание этого вызывает много новых проблем пользователей. (См.в этой статье для различных результатов вы можете получить, не устанавливая ширину в 0.) Если ваши взгляды находятся в вертикальныйLinearLayout
тогда вы бы использовалиlayout_height="0dp"
, конечно.на
Button
пример выше я установил вес в 1, но вы можете использовать любое число. Это единственное, что имеет значение. Вы можете видеть в трех рядах кнопок на первом изображении, которое я опубликовал, цифры все разные, но поскольку пропорции одинаковы, взвешенные ширины не меняются в каждой строке. Некоторые люди любят использовать десятичные числа, которые имеют сумму 1, так что в сложной компоновке ясно, что вес каждой части.последнее замечание. Если у вас есть много вложенных макетов, которые используют
layout_weight
, это может быть плохо для производительности.дополнительно
вот 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>
layout_weight
рассказывает Android, как распространять вашView
СLinearLayout
. Затем Android сначала вычисляет общую долю, необходимую для всехView
s, которые имеют определенный вес и размещают каждыйView
согласно какой части экрана он указал, что ему нужно. В следующем примере Android видит, чтоTextView
Сlayout_weight
of0
(по умолчанию) иEditText
Сlayout_weight
of2
каждый, в то время какButton
имеет вес1
. Таким образом, Android выделяет "достаточно места" для отображенияtvUsername
иtvPassword
а потом делит оставшуюся часть ширины экрана на 5 равных частей, две из которых выделяютсяetUsername
, дваetPassword
и последняя частьbLogin
:<LinearLayout android:orientation="horizontal" ...> <TextView android:id="@+id/tvUsername" android:text="Username" android:layout_width="wrap_content" ... /> <EditText android:id="@+id/etUsername" android:layout_width="0dp" android:layout_weight="2" ... /> <TextView android:id="@+id/tvPassword" android:text="Password" android:layout_width="wrap_content" /> <EditText android:id="@+id/etPassword" android:layout_width="0dp" android:layout_weight="2" ... /> <Button android:id="@+id/bLogin" android:layout_width="0dp" android:layout_weight="1" android:text="Login"... /> </LinearLayout>
выглядит так:
и
думаю, что это так, будет проще
Если у вас есть 3 кнопки и их вес 1,3,1 соответственно, он будет работать как таблица в HTML
обеспечить 5 частей для этой линии: 1 часть для кнопки 1, 3 часть для кнопки 2 и 1 часть для кнопки 1
связи
одним из лучших объяснений для меня было этот (из учебника Android, найдите Шаг 7):
layout_weight используется в LinearLayouts для присвоения" важности " для видов в макете. Все виды имеют значение layout_weight по умолчанию равное нулю, что означает, что они занимают только столько места на экране, сколько им нужно для отображения. Присвоение значения выше нуля разделит остальную часть доступного пространства в Родительском представлении в соответствии со значением layout_weight каждого вида и его отношение к общему layout_weight, указанному в текущем макете для этого и других элементов вида.
для примера: допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. На этикетке не указан layout_weight, поэтому она занимает минимальное пространство, необходимое для оказания. Если layout_weight каждого из двух элементов редактирования текста имеет значение 1, оставшаяся ширина в Родительском макете будет разделена поровну между ними (потому что мы утверждаем, что они одинаково важны). Если первый имеет layout_weight 1, а второй имеет layout_weight 2, то одна треть оставшегося пространства будет отдана первому, а две трети-второму (потому что мы утверждаем, что второй более важен).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight определяет, сколько места элемент управления должен получить соответственно для других элементов управления.
пожалуйста, посмотрите на weightSum LinearLayout и layout_weight каждого представления. android: weightSum= " 4 " android:layout_weight=" 2"android:layout_weight=" 2 " их layout_height оба 0px, но я не уверен, что это уместно
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="4"> <fragment android:name="com.example.SettingFragment" android:id="@+id/settingFragment" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="2" /> <Button android:id="@+id/dummy_button" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="2" android:text="DUMMY" /> </LinearLayout>
дополнительные:
на
vertical
ориентация, не забудьте установитьheight
в 0dp хиллингдонandroid:layout_height="0dp"
на
horizontal
ориентация, не забудьте установитьwidth
в 0dp хиллингдонandroid:layout_width="0dp"
объединение обоих ответов от
Flo & rptwsthi и roetzi,
Не забудьте изменить свой
layout_width=0dp/px
, иначеlayout_weight
поведение будет действовать обратно с наибольшим числом, занимающим наименьшее пространство, и наименьшим числом, занимающим наибольшее пространство.кроме того, некоторая комбинация Весов приведет к тому, что некоторые макеты не могут быть показаны (поскольку они занимают пространство).
остерегайтесь этого.
как следует из названия, вес макета определяет, какое количество или процент пространства должно занимать определенное поле или виджет на экране.
Если мы указываем вес в горизонтальной ориентации, то мы должны указатьlayout_width = 0px
.
Аналогично, если мы указываем вес в вертикальной ориентации, то мы должны указатьlayout_height = 0px
.