Линейная компоновка и вес в 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>

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 5

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

Ответ 6

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

Ответ 8

Как ответ @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 of is 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>

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

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

Ответ 16

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

Ответ 17

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

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

Ответ 18

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

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

Ответ 19

Деятельность 1 состоит из названия TV ниже ET, электронной почты TV ниже ET, телефона TV ниже ET, DOB TV Infront of ET (Datepicker), Qualification TV ниже ET, Time TV Infront of ET (Timepicker должно быть с AM/PM), под представлением прокрутки назначьте одну кнопку (сохранить). После нажатия кнопки "Сохранить" необходимо отобразить одну ListView (содержащую Items5 с подробностями о человеке по умолчанию, как в упражнении 1), а сведения о человеке, которые мы вводим, должны быть добавлены в ListView сверху, означают всего 6 элементов, которые должны удалить все элементы6 и кнопки Обновить, удалить означает, что необходимо удалить из ListView, Обновление означает, что должен быть открыт один настраиваемый dailog (все детали edittexts должны быть видны) и обновить то, что мы вводим в действии 1, и его нужно обновить. может кто-нибудь помочь мне в этом, пожалуйста