Линейный макет и вес в Android

262

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

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

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

Януш
источник
Обновление: поддержка Android android также может сделать это очень хорошо. code2concept.blogspot.in/2015/08/…
nitesh

Ответы:

160

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

JeremyFromEarth
источник
684

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

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

И результат:

Пример веса макета

Анке
источник
66
Спасибо за совет об установке ширины в ноль. Я также обнаружил, что установка weightSum для родителя не нужна.
Джейсон Мур
30
Полезно знать, спасибо. Если это так, установка weightSum может быть полезной, если вы не хотите, чтобы дети заполняли 100% родительского элемента.
Анке
13
Это правильно для статических макетов XML. Если вы добавляете виды динамически во время выполнения, вам нужно использовать addView с параметрами макета, такими как addView(button, new LinearLayout.LayoutParams(0, height, 1));Это верно, даже если вы надуваете макеты с правильными значениями ширины и веса.
Поползень
Вы говорите: установите android: weightSum для родителя - установите для него какое-то значение или просто вставьте его, как это должно быть установлено?
TheJerm
1
@batbrat правильно, я генерировал пользовательский интерфейс динамически. Иногда я рассматриваю фрагменты XML как шаблоны, а затем изменяю или заполняю их во время выполнения. Этот трюк не работал для меня в этом случае, мне пришлось заново установить явную ширину и вес, чтобы заставить его работать.
Поползень
52

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

Маной Сеелан
источник
16

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

jqpubliq
источник
Теперь обе кнопки исчезли с экрана
Janusz
Хорошо, тогда установите ширину макета на fill_parent и weights на 0.5
jqpubliq
взгляните на это и это . Я немного сбит с толку относительно того, почему это все еще не работает, но, возможно, это даст вам некоторые идеи.
jqpubliq
7

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) 
Ракеш Сони
источник
7

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

Зеленый Гоблин
источник
6

Как ответ @Manoj Seelan

Заменить android:layout_weightWith android:weight.

Когда вы используете вес с LinearLayout. Вы должны добавить weightSumв LinearLayoutи в соответствии с ориентацией вашей LinearLayoutвы должны заходящей 0dpна ширин / высоты для всех LinearLayout`S мнения детей

Пример :

Если Ориентация 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>
ахмед хамди
источник
5

Возможно, установка обеих свойств 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» на обеих кнопках.

JeremyFromEarth
источник
1
это только выталкивает правую кнопку из экрана и показывает только первую кнопку.
Януш
4
<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>
Yar
источник
Теперь я бы предпочел использовать layout_weight = "50" и layout_width = "0px"
Яр
2

В приведенном выше XML, установите android:layout_weightлинейный макет как 2: android:layout_weight="2"

Приянка
источник
3
Зачем это нужно? Почему вес макета 2 важен? Почему не 20 или 200?
Конрад Фрикс
2

Кроме того, вы должны добавить это android:layout_width="0dp"для просмотра детьми [Button views] ofLinerLayout

Ребека
источник
2

Вы должны написать так, это работает для меня

<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" />
Динеш Сайни
источник
2

Ниже приведены изменения (отмечены жирным шрифтом ) в вашем коде:

<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) .

Поскольку есть два вида, и вы разместили android:layout_weight="1"оба вида, это означает, что он разделит два вида по горизонтали (или по ширине).

Акшай Чопра
источник
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>
Катрина Хан
источник
0

Это идеальный ответ вашей проблемы

  <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>
Рахул Мандалия
источник
3
Так это "вес" или "layout_weight" ??
Игорь Ганапольский
Это андроид: layout_weight
Махендра Гунавардена
0

Заменить wrap_contentна fill_parent.

Умберто Пиньейру
источник
0
 <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>

введите описание изображения здесь

سیدرسول میرعظیمی
источник