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

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

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

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


person Janusz    schedule 23.04.2010    source источник
comment
обновление: поддержка процентов Android также может сделать это очень хорошо. code2concept.blogspot.in/2015/08/   -  person nitesh    schedule 06.11.2015


Ответы (17)


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

person JeremyFromEarth    schedule 23.04.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>

И результат:

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

person Anke    schedule 23.12.2010
comment
Спасибо за совет об установке ширины на ноль. Я также обнаружил, что установка weightSum для родителя не нужна. - person Jason Moore; 27.02.2011
comment
Полезно знать, спасибо. Если это так, установка weightSum может быть полезна, когда вы не хотите, чтобы дочерние элементы заполняли 100% родительского элемента. - person Anke; 28.02.2011
comment
Это верно для статических макетов XML. Если вы добавляете представления динамически во время выполнения, вам необходимо использовать addView с параметрами макета, такими как addView(button, new LinearLayout.LayoutParams(0, height, 1));. Это верно, даже если вы увеличиваете макеты с правильными значениями ширины и веса. - person Nuthatch; 04.09.2011
comment
Вы говорите, установите android: weightSum родительского элемента - установите для него какое-то значение или просто введите его, как это должно быть установлено? - person theJerm; 18.10.2012
comment
theJerm, да, weightSum должно быть значением. Это значение представляет 100% ширины макета. Итак, если, например, weightSum = 1 и layout_weight дочернего элемента = 0.3, тогда дочерний элемент будет занимать 30% ширины своего родителя. Если weightSum = 250 и дочерний layout_weight = 200, тогда дочерний элемент будет иметь 80% (потому что: 200/250 * 100% = 80%) и т. Д. WeightSum должен быть ›0, а сумма дочерних layout_weight должна быть‹ = weightSum. - person Anke; 18.10.2012
comment
Я делаю именно то, что описано выше, с включенными макетами (используя тег include), и, по-видимому, это не работает. Возможно, это еще один замечательный побочный эффект, включающий теги -_- .... - person AgentKnopf; 07.01.2013
comment
Зайнодис, что именно вы включили? - person Anke; 07.01.2013
comment
@Nuthatch, я не понимаю, к чему вы клоните. Особенно когда вы говорите: «Это правда, даже если вы надуваете макеты с правильными значениями ширины и веса». Не могли бы вы уточнить? - person batbrat; 30.03.2014
comment
@batbrat Прошло некоторое время, но я полагаю, что имел в виду, что значения ширины и веса, завышенные из XML, игнорируются. Поэтому вам нужно предоставить программно, если вы используете addView - person Nuthatch; 30.03.2014
comment
@Nuthatch, спасибо за быстрый ответ. Я не понимаю, зачем использовать addView (), если мы раздуваем макет, если мы не добавляем некоторые части пользовательского интерфейса динамически. В этом случае параметры макета в XML не будут применяться ни к чему, указанному с помощью addView, и они должны быть явно указаны с помощью LayoutParams. Вы это имели в виду? - person batbrat; 31.03.2014
comment
@batbrat правильно, я динамически генерировал пользовательский интерфейс. Иногда я рассматриваю фрагменты XML как шаблоны, а затем изменяю или заполняю их во время выполнения. В этом случае этот трюк у меня не сработал, мне пришлось заново установить явную ширину и вес, чтобы заставить его работать. - person Nuthatch; 31.03.2014
comment
Спасибо! Странно, что приходилось это делать даже из-за завышенных просмотров. Очень странный. Может быть, это связано с тем, что LinearLayout повторно калибруется, когда вы программно добавляете и снова нуждается в информации? Я разберусь с этим. :) Спасибо еще раз! - person batbrat; 31.03.2014
comment
Также не забудьте установить layout_width LinearLayout не на wrap_content, а на match_parent или фиксированное значение. Я просто не обращал на это внимания в течение 15 минут. - person Moritur; 11.04.2016
comment
Это действительно помогло. Спасибо работает как шарм - person Parthan_akon; 21.05.2021

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

person Manoj Seelan    schedule 12.09.2012

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

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

Вы можете перейти по этой ссылке для получения дополнительной информации по теме. Just Maths - Views, View Groups and Layouts

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

Руководство по линейной компоновке Android

person Cheezy Code    schedule 19.11.2015

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

person jqpubliq    schedule 23.04.2010
comment
Теперь обе кнопки исчезли с экрана - person Janusz; 23.04.2010
comment
хорошо, затем установите ширину макета на fill_parent и вес на 0,5 - person jqpubliq; 23.04.2010
comment
взгляните на this и это. Я немного смущен тем, почему это все еще не работает, но, возможно, это даст вам некоторые идеи. - person jqpubliq; 23.04.2010

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) 
person Rakesh Soni    schedule 26.07.2013

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

person Green goblin    schedule 03.03.2014

Как ответ @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>
person ahmed hamdy    schedule 13.05.2015

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

person JeremyFromEarth    schedule 23.04.2010
comment
это только выталкивает правую кнопку с экрана и показывает только первую кнопку. - person Janusz; 23.04.2010

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

person Priyanka    schedule 18.08.2010
comment
Зачем это нужно? Почему важен вес макета 2? Почему не 20 или 200? - person Conrad Frix; 14.12.2012

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

person Rebeka    schedule 11.12.2012

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

<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" />
person Dinesh Saini    schedule 06.10.2016

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

<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" для обоих представлений, это означает, что он разделит два представления поровну по горизонтали (или по ширине).

person Akshay Chopra    schedule 17.04.2018

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

  <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>
person Rahul Mandaliya    schedule 06.07.2011
comment
Так это вес или layout_weight ?? - person IgorGanapolsky; 06.04.2012
comment
Это android: layout_weight - person Mahendra Gunawardena; 29.12.2013

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

person Humberto Pinheiro    schedule 23.04.2010

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

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

person سیدرسول میرعظیمی    schedule 17.02.2017

person    schedule
comment
Теперь я бы предпочел использовать layout_weight = 50 и layout_width = 0px. - person Yar; 07.06.2012