Линейный макет и вес в андроид
-
01-10-2019 - |
Вопрос
Я всегда читаю об этом забавном весовом значении в документациях Android. Теперь я хочу попробовать это в первый раз, но он вообще не работает.
Как я понимаю его из документации этой макета:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:text="Register"
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
weight="1" />
<Button
android:text="Not this time"
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
weight="1" />
</LinearLayout>
Должна создать две кнопки, которые горизонтально выровнены и имеют одинаково пространство. Проблема в том, что две кнопки не растут, чтобы заполнить пространство.
Я хотел бы, чтобы кнопки были расти и заполнить всю линию. Если оба кнопки настроены на соответствие родителями, только первая кнопка отображается и заполняет всю строку.
Решение
Вы не устанавливаете layout_weight
имущество. Ваш код читает weight="1"
и это должно прочитать android:layout_weight="1"
.
Другие советы
3 вещи, чтобы помнить:
- установить Android: Layout_width детей до "0dp"
- установить Android: WeeSum. родителя (редактировать: Как заметил Джейсон Мур, этот атрибут является необязательным, потому что по умолчанию он устанавливается на сумму детской макеты)
- установить Android: Layout_weight. каждого ребенка пропорционально (например, Heagsum = "5", три детей: layout_weight = "1", layout_weight = "3", layout_weight = "1")
Пример:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weightSum="5">
<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="3"
android:text="2" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="3" />
</LinearLayout>
И результат:
Это android:layout_weight
. Отказ Вес можно использовать только в LinearLayout
. Отказ Если ориентация linearlayout вертикальна, то используйте android:layout_height="0dp"
И если ориентация горизонтальная, то используйте android:layout_width = "0dp"
. Отказ Это будет работать идеально.
Это изображение суммирует линейную планировку.
Вы можете выполнить эту ссылку для получения дополнительной информации по теме. Просто математика - виды, просматривать группы и макеты
Видеоуправление для линейной макеты: ширина, высота и веса
Попробуйте установить layout_width
обеих кнопок на «0DIP» и weight
обеих кнопок к 0.5
LinearLayout поддерживает присвоение веса для отдельных детей. Этот атрибут назначаетважность«Значение для представления и позволяет расширить, чтобы заполнить любое оставшееся пространство на родительском представлении. Вес по умолчанию равен нулю
Расчет назначить любой Оставшиеся / дополнительно пространство между ребенком. (не общее пространство)
Пространство, назначенное для ребенка = (ребенок индивидуальный вес) / (сумма веса каждого ребенка в линейной макете)
Пример (1): Если есть три текстовых поля, и двое из них объявляют вес 1, в то время как третий отдается не весом (0), то Оставшиеся / дополнительно пространство назначает
1st text box = 1/(1+1+0)
2nd text box = 1/(1+1+0)
3rd text box = 0/(1+1+0)
Пример (2) : Допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Этикетка не имеет указанного макета_, поэтому он занимает минимальное пространство, необходимое для рендера. Если Layout_Weight каждой из двух элементов редактирования текста устанавливается на 1, оставшаяся ширина в родительской макете будет равномерно расщеплена между ними (потому что мы утверждаем, что они одинаково важны).
calculation :
1st label = 0/(0+1+1)
2nd text box = 1/(0+1+1)
3rd text box = 1/(0+1+1)
Если первый текстовый блок имеет Layout_weight 1, а второе текстовое поле имеет макет 2 веса 2, то одна треть оставшегося пространства будет дано первой, а две трети на вторую (потому что мы претендуем на второй более важный).
calculation :
1st label = 0/(0+1+2)
2nd text box = 1/(0+1+2)
3rd text box = 2/(0+1+2)
В поле ширины кнопки заменить wrap-content
с участием 0dp
.
Используйте атрибут Layout_Weight вида.
android:layout_width="0dp"
Вот как ваш код будет выглядеть:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:text="Register"
android:id="@+id/register"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" />
<Button
android:text="Not this time"
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" />
</LinearLayout>
Layout_Weight используется для распределения какого-либо левого места в пропорции. В этом случае две кнопки принимают ширину «0DP». Таким образом, остальное пространство будет разделено на 1: 1 пропорцию среди них, то есть пространство будет разделено поровну между видами кнопок.
Как ответ @Manoj seelan.
Заменять android:layout_weight
С участием android:weight
.
Когда вы используете Масса с участием LinearLayout
. Отказ Вы должны добавить weightSum
в LinearLayout
и в соответствии с ориентацией вашего LinearLayout
Вы должны установить 0dp
Для ширины / высоты всем LinearLayout
виды детей
Пример :
Если Ориентация Linearlayout
является Vertical
Затем установите ширину всех LinearLayout
вид детей с 0dp
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:weightSum="3">
<Button
android:text="Register"
android:id="@+id/register"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="2" />
<Button
android:text="Not this time"
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" />
</LinearLayout>
Если ориентация Linearlayout
о horizontal
Затем установите высоту всех LinearLayout
вид детей с 0dp
.
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<Button
android:text="Register"
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="10dip"
android:layout_weight="2" />
<Button
android:text="Not this time"
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="10dip"
android:layout_weight="1" />
</LinearLayout>
Возможно, установить оба кнопки Layout_Width Properties для «Fill_Parent», сделает трюк.
Я только что проверил этот код, и он работает в эмуляторе:
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="hello world"/>
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="goodbye world"/>
</LinearLayout>
Обязательно установите Layout_Width на «Fille_Parent» на обеих кнопках.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/logonFormButtons"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:baselineAligned="true"
android:orientation="horizontal">
<Button
android:id="@+id/logonFormBTLogon"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/logon"
android:layout_weight="0.5" />
<Button
android:id="@+id/logonFormBTCancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/cancel"
android:layout_weight="0.5" />
</LinearLayout>
В приведенном выше XML установите android:layout_weight
линейного макета как 2
:
android:layout_weight="2"
Плюс вам нужно добавить это android:layout_width="0dp"
Для детей видов [Пункт кнопки LinerLayout
Вы должны написать так, как это работает для меня
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2">
<Button
android:text="Register"
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" />
<Button
android:text="Not this time"
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="Button 1" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="Button 2" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="Button 3" />
</LinearLayout>
Ниже приведены изменения (отмечены в ЖИРНЫЙ) В вашем коде:
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:text="Register"
android:id="@+id/register"
android:layout_width="0dp" //changes made here
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" /> //changes made here
<Button
android:text="Not this time"
android:id="@+id/cancel"
android:layout_width="0dp" //changes made here
android:layout_height="wrap_content"
android:padding="10dip"
android:layout_weight="1" /> //changes made here
</LinearLayout>
Поскольку ваш Linearlayout имеет ориентацию в качестве горизонтали, поэтому вам нужно будет сохранить ширина только как 0dp. для использования весов в этом направлении. (Если ваша ориентация была вертикальной, вы бы держали свой высот только 0DP).
Так как есть 2 просмотра, и вы разместили android:layout_weight="1"
Для взглядов это означает, что он будет разделить два взгляда одинаково в горизонтальном направлении (или шириной).
Это идеальный ответ на вашу проблему
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:text="Register" android:id="@+id/register"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:padding="10dip" weight="1" />
<Button
android:text="Not this time" android:id="@+id/cancel"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:padding="10dip" weight="1" />
</LinearLayout>
Заменять wrap_content
с участием fill_parent
.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="#008">
<RelativeLayout
android:id="@+id/paneltamrin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<Button
android:id="@+id/BtnT1"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:drawableTop="@android:drawable/ic_menu_edit"
android:drawablePadding="6dp"
android:padding="15dp"
android:text="AndroidDhina"
android:textColor="#000"
android:textStyle="bold" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/paneltamrin2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
>
<Button
android:layout_width="wrap_content"
android:layout_height="150dp"
android:drawableTop="@android:drawable/ic_menu_edit"
android:drawablePadding="6dp"
android:padding="15dp"
android:text="AndroidDhina"
android:textColor="#000"
android:textStyle="bold" />
</RelativeLayout>
</LinearLayout>