Лінійний макет і вага в 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.