Линейный макет и вес в Android - PullRequest
246 голосов
/ 23 апреля 2010

Я всегда читал об этом забавном значении веса в документации 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>

должно создать две кнопки, которые выровнены по горизонтали и разделят пространство одинаково. Проблема в том, что две кнопки не растут, чтобы заполнить пространство.

Я бы хотел, чтобы кнопки росли и заполняли всю строку. Если обе кнопки настроены на соответствие родительскому элементу, отображается только первая кнопка, которая заполняет всю строку.

Ответы [ 18 ]

655 голосов
/ 23 декабря 2010

3 вещи, которые нужно запомнить:

  • установите для android: layout_width детей значение "0dp"
  • установите android: weightSum родителя ( edit: , как заметил Джейсон Мур, этот атрибут является необязательным, потому что по умолчанию он установлен на сумму layout_weight для детей)
  • установить android: layout_weight каждого ребенка пропорционально (например, weightSum = "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>

И результат:

Layout weight example

148 голосов
/ 23 апреля 2010

Вы не устанавливаете свойство layout_weight. Ваш код читает weight="1", и он должен читать android:layout_weight="1".

51 голосов
/ 12 сентября 2012

Это android:layout_weight. Вес можно использовать только в LinearLayout. Если ориентация linearlayout - Вертикальная, тогда используйте android:layout_height="0dp", а если ориентация горизонтальная, то используйте android:layout_width = "0dp". Это будет отлично работать.

22 голосов
/ 19 ноября 2015

Это изображение суммирует линейный макет.

Linear Layout and Weight

Вы можете перейти по этой ссылке для получения дополнительной информации по теме. Just Maths - Представления, просмотр групп и макетов

Видеоруководство по линейному макету: ширина, высота и вес

Android Linear LayoutУчебное пособие

15 голосов
/ 23 апреля 2010

Попробуйте установить layout_width обеих кнопок на «0dip» и weight обеих кнопок на 0.5

7 голосов
/ 26 июля 2013

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, поэтому он занимает минимальное пространство, необходимое для визуализации. Если для 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, а второе текстовое поле имеет layout_weight, равный 2, то одна треть оставшегося пространства будет отдана первой, а две трети - второй (поскольку мы требуем второй важнее).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 
6 голосов
/ 03 марта 2014

В поле ширины кнопки замените 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, то есть пространство будет разделено поровну между представлениями кнопок.

5 голосов
/ 13 мая 2015

Как и ответ @ 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>
4 голосов
/ 23 февраля 2011
<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>
4 голосов
/ 23 апреля 2010

Возможно, установка обеих свойств layout_width кнопок для "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 значение "fill_parent" на обеих кнопках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...