Лінійний макет і вага в Android


261

Я завжди читав про це смішне значення ваги в документаціях на 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>

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

Я хотів би, щоб кнопки зростали і заповнювали весь рядок. Якщо обидві кнопки встановлені відповідно до батьківського, відображається лише перша кнопка, яка заповнює весь рядок.


оновлення: підтримка андроїд-відсотків також може зробити це дуже добре. code2concept.blogspot.in/2015/08/…
— nitesh

Відповіді:


159

Ви не встановлюєте layout_weightвластивість. Ваш код читає, weight="1"і він повинен читати android:layout_weight="1".


684

3 речі, які слід пам’ятати:

  • встановіть для Android: layout_width дітей на "0dp"
  • встановіть для батьків андроїд: weightSum ( редагуйте: як зауважив Джейсон Мур, цей атрибут необов'язковий, оскільки за замовчуванням він встановлений у розмірі розміру ваги для дітей)
  • встановіть андроїд: 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));це. Це справедливо, навіть якщо ви надуваєте макети з правильними значеннями ширини та ваги.
— Nuthatch

Ви кажете встановити андроїд: weightSum батьківського - встановіть його на якесь значення або просто поставте його, як це слід встановити?
— theJerm

1
@batbrat вірно, я створював інтерфейс динамічно. Я іноді розглядаю фрагменти XML як шаблони, а потім змінюю або заповнюю під час виконання. Цей трюк не спрацював для мене в цьому випадку, мені довелося знову встановити чітку ширину і вагу, щоб змусити його працювати.
— Нутч

52

Це android:layout_weight. Вагу можна використовувати тільки в LinearLayout. Якщо орієнтація лінійного розміщення вертикальна, тоді використовуйте, android:layout_height="0dp"а якщо орієнтація горизонтальна, то використовуйте android:layout_width = "0dp". Він буде працювати ідеально.


27

Це зображення підсумовує лінійний макет.

Лінійний макет і вага

Ви можете перейти за цим посиланням для отримання додаткової інформації по темі. Просто математика - перегляди, перегляд груп та макетів

Відеоурок для лінійного макета: ширина, висота та ваги

Підручник для лінійної версії Android


16

Спробуйте встановити layout_widthобидві кнопки на "0dip", а weightобидві кнопки -0.5


Тепер обидві кнопки зникли з екрану
— Janusz

Гаразд, тоді встановіть ширину макета як для fill_parent, так і для ваг на 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) : скажімо, у нас є текстова мітка та два елементи редагування тексту в горизонтальному рядку. Етикетка не вказана макет-вага, тому вона займає мінімальний простір, необхідний для візуалізації. Якщо розмір_схема кожного з двох елементів редагування тексту встановлений на 1, решта ширини у батьківському макеті будуть розділені між ними порівну (оскільки ми вважаємо, що вони однаково важливі).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Якщо перше текстове поле має макет_в вазі 1, а друге текстове поле має макет_ вагу 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дітей-переглядів `s0dp

 <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"для дитячих подань [Перегляди кнопок] відLinerLayout


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

Нижче наведено зміни (позначені BOLD ) у вашому коді:

<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" ??
— ІгорГанапольський

Це android: layout_weight
— Mahendra


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.