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


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



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

548   18  

18 ответов:

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

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

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

в этом рисунке представлена Линейная планировка.

Linear Layout and Weight

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

Видео-Учебник Для Линейной Компоновки: Ширина, Высота И Вес

Android Линейный Макет Учебник

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

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) 

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

как ответ @Manoj Seelan

заменить android:layout_weight С android:weight.

при использовании вес С LinearLayout. вы должны добавить weightSum на LinearLayout и в соответствии с ориентацией вашего LinearLayout вы должны установить 0dp для ширины/высоты для всех LinearLayoutС точки зрения детей

пример :

если ориентация Linearlayout и Vertical , затем установите ширину всех `ы виды с 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>

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

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

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

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

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

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

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

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

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

заменить wrap_content с fill_parent.

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

enter image description here

Ниже приведены изменения (отмечены в полужирный) в коде:

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

Comments

    Ничего не найдено.