Линейный макет и вес в 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".


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


Теперь обе кнопки исчезли с экрана
— 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» на обеих кнопках.


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>

Теперь я бы предпочел использовать 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
 <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>

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.