Що означає android: layout_weight?


Відповіді:


860

За допомогою layout_weightвас можна вказати співвідношення розмірів між кількома переглядами. Наприклад, у вас є MapViewта, tableякий повинен показати деяку додаткову інформацію на карті. Карта повинна використовувати 3/4 екрана, а таблиця повинна використовувати 1/4 екрана. Тоді ви будете встановити layout_weightз mapдо 3 і layout_weightзtable 1.

Для його роботи також потрібно встановити висоту або ширину (залежно від вашої орієнтації) 0 пікс.


208
голова дряпалка, поки ви не згадали про висоту 0px!
JohnnyLambada

24
Визначити, який з них буде впливати на вагу. Ширина або висота.
neteinstein

30
Вам потрібен 0px. Приклад: ви хочете реалізувати таблицю з двома стовпцями однакового розміру. Кожен рядок таблиці - це горизонтальний лінійний макет з двома "осередками таблиці" (наприклад, TextViews), кожна з яких має layout_weight = .5. Якщо вказати layout_width = "wrap_content" на "комірки таблиці", ширина вмісту буде додана до ширини, обчисленої layout_weight, комірки таблиці будуть різного розміру, а стовпці не будуть розташовуватися правильно. Отже, ви повинні встановити layout_width = 0dp, щоб андроїд використовував лише layout_weight для обчислення ширини комірок.
eeeeaaii

3
@Solace, пізня відповідь, але задля повноти. Здається, атрибут ваги не сприяє RelativeLayout. Він працює лише з LinearLayout. Якщо ви бачите необхідність у вазі, можливо, шлях слід створити LinearLayout (з вагами) в RelativeLayout.
bbv

1
чи layout_weight працює лише для лінійного макета або він буде працювати для кожної групи перегляду.
meShakti

247

Коротше кажучи, layout_weightвказує, скільки додаткового місця в макеті має бути виділено Перегляду.

LinearLayout підтримує призначення ваги окремим дітям. Цей атрибут присвоює перегляду значення "важливості" і дозволяє йому розширюватися, щоб заповнити будь-який залишився простір у батьківському поданні. Вага за замовчуванням у перегляді дорівнює нулю.

Розрахунок для призначення будь-якого залишкового простору між дочірнім

Загалом, формула така:

простір, призначений дитині = (індивідуальна вага дитини) / (сума ваги кожної дитини в лінійному макеті)

Приклад 1

Якщо є три текстові поля, і два з них оголошують вагу 1, а третьому немає ваги (0), то решта місця призначається таким чином:

1-е текстове поле = 1 / (1 + 1 + 0)

2-е текстове поле = 1 / (1 + 1 + 0)

3-е текстове поле = 0 / (1 + 1 + 0)

Приклад 2

Скажімо, у нас є текстова мітка та два елементи редагування тексту в горизонтальному рядку. Мітка не layout_weightвказана, тому вона займає мінімальний простір, необхідний для візуалізації. Якщо layout_weightдля кожного з двох елементів редагування тексту встановлено 1, решта ширини у батьківському макеті буде розділена між ними порівну (оскільки ми стверджуємо, що вони однаково важливі).

Розрахунок:

1-я мітка = 0 / (0 + 1 + 1)

2-е текстове поле = 1 / (0 + 1 + 1)

3-е текстове поле = 1 / (0 + 1 + 1)

Якщо натомість у першому текстовому полі розміщено layout_weight1, а у другому текстовому полі - layout_weight2, то одна третина решти місця буде надана першій, а дві третини - другій (тому що ми вимагаємо другий один важливіший).

Розрахунок:

1-я мітка = 0 / (0 + 1 + 2)

2-е текстове поле = 1 / (0 + 1 + 2)

3-е текстове поле = 2 / (0 + 1 + 2)


Стаття джерела


19
Набагато краще пояснення, ніж обрана на даний момент відповідь.
Тінь

12
Що ж, є просте пояснення (яке я ціную) та делікатні зернисті деталі (які я ціную по-іншому). Вони обидва хороші відповіді.
cbmanica

3
Як було сказано в іншому місці, android:layout_width="0px"це важливо. Крім того, ваги не повинні бути цілими числами.
Брайан Уайт

Це трохи складніше для розуміння, ніж обрана відповідь, але вона дає повну відповідь - особливо коли деякі погляди мають вагу, а деякі ні. Це величезний випадок використання, не охоплений обраною відповіддю.
Ейсі

куди ж тоді weightSumприходить картина? Чи має це щось спільне layout_weight?
eRaisedToX

72

додаючи до інших відповідей, найголовніше, щоб змусити це працювати, це встановити ширину (або висоту) макета на 0px

android:layout_width="0px"

інакше ви побачите сміття


Я думаю, це залежить від того, чи хочете ви приховати види, які не визначають їх вагу, або ви хочете показувати їх з розміром, який відповідає розміру, і залишити вільний простір для "зважених" поглядів.
Андреа Леганца

Що робити, якщо мені потрібно встановити як горизонтальну, так і вертикальну вагу?
Елстон

40

Якщо існує декілька представлень, що охоплюють а LinearLayout, layout_weightнадає кожному пропорційний розмір. Вид з більшим layout_weightзначенням "важить" більше, тому він отримує більший простір.

Ось зображення, щоб зробити речі більш зрозумілими.

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

Теорія

Термін вагової компонування пов'язаний з поняттям середньозваженого в математиці. Це як у класі коледжу, де домашнє завдання вартує 30%, відвідуваність - 10%, середньострокова - 20%, а фінальна - 40%. Ваші оцінки за ці частини, коли зважуються разом, дають вам загальну оцінку.

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

Це однаково для ваги компонування. Кожен Viewsз горизонтальних LinearLayoutможе займати певний відсоток від загальної ширини. (Або відсоток від висоти для вертикалі LinearLayout.)

Макет

Те, LinearLayoutщо ви використовуєте, буде виглядати приблизно так:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <!-- list of subviews -->

</LinearLayout>

Зверніть увагу, що ви повинні використовувати layout_width="match_parent"для LinearLayout. Якщо ви користуєтеся wrap_content, то це не спрацює. Також зауважте, що layout_weightне працює для переглядів у RelativeLayouts (дивіться тут і тут відповіді на відповідь, що стосуються цього питання).

Погляди

Кожен вид в горизонталі LinearLayoutвиглядає приблизно так:

<Button
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

Зауважте, що вам потрібно користуватися layout_width="0dp"разом із layout_weight="1". Якщо забути це, виникає багато нових користувачів. (Дивіться цю статтю для різних результатів, які ви можете отримати, не встановлюючи ширину на 0.) Якщо ваші погляди у вертикалі, LinearLayout то layout_height="0dp", звичайно, ви б їх використали .

У Buttonнаведеному вище прикладі я встановив вагу в 1, але ви можете використовувати будь-яке число. Має значення лише загальне. Ви можете бачити в трьох рядках кнопок на першому зображенні, яке я розмістив, цифри всі різні, але оскільки пропорції однакові, зважена ширина не змінюється в кожному рядку. Дехто любить використовувати десяткові числа, які мають суму 1, так що в складному макеті зрозуміло, яка вага кожної частини.

Одне заключне зауваження. Якщо у вас є багато вкладених макетів, які використовуються layout_weight, це може бути погано для продуктивності.

Додатково

Ось макет xml для верхнього зображення:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <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="2"
            android:text="2" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="1" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="20"
            android:text="20" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="10"
            android:text="10" />

    </LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="android:layout_weight="
        android:textSize="24sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".50"
            android:text=".50" />

        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight=".25"
            android:text=".25" />

    </LinearLayout>

</LinearLayout>

1
Мені завжди цікаво, чому більшість людей не публікують зображення, які супроводжують їх XML. Набагато простіше зрозуміти візуальні засоби, ніж код.
ОлександрХ

30

layout_weightрозповідає Android, як розповсюджувати свої Viewфайли в LinearLayout. Потім Android спочатку розраховує загальну пропорцію, необхідну для всіх Views, які мають вказану вагу, і розміщує кожного Viewвідповідно до того, який саме фрагмент екрана він вказав. У наступному прикладі, Android бачить , що TextViewїй є layout_weightз 0(це за замовчуванням) і EditTexts має layout_weightв 2кожному, в той час як Buttonмає вагу 1. Таким чином, Android виділяє просто «достатньо» місця для відображення, tvUsernameа tvPasswordпотім ділить решту ширини екрана на 5 рівних частин, дві з яких виділяються etUsername, дві до etPasswordостанньої частини bLogin:

<LinearLayout android:orientation="horizontal" ...>

    <TextView android:id="@+id/tvUsername" 
    android:text="Username" 
    android:layout_width="wrap_content" ... />

    <EditText android:id="@+id/etUsername"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <TextView android:id="@+id/tvPassword"
    android:text="Password"
    android:layout_width="wrap_content" />

    <EditText android:id="@+id/etPassword"
    android:layout_width="0dp"
    android:layout_weight="2" ... />

    <Button android:id="@+id/bLogin"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:text="Login"... />

</LinearLayout>

Схоже:
ландшафтна орієнтація і
портретна орієнтація


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

16

Думайте, що так, буде простіше

Якщо у вас є 3 кнопки, а їх вага відповідно 1,3,1, вона працюватиме як таблиця в HTML

Укажіть 5 частин для цього рядка: 1 частина для кнопки 1, 3 частини для кнопки 2 та 1 частина для кнопки 1

З повагою,


10

одне з найкращих пояснень для мене було це (з підручника Android, шукайте крок 7) :

layout_weight використовується в LinearLayouts для присвоєння "важливості" Переглядам у межах макета. Усі представлення за замовчуванням layout_weight zero, тобто вони займають лише стільки місця на екрані, скільки потрібно для відображення. Призначення значення, що перевищує нуль, розділить решту доступного простору у батьківському перегляді відповідно до значення макета кожного перегляду та його відношення до загальної ваги макета, визначеного в поточному макеті для цього та інших елементів Перегляду.

Для прикладу: скажімо, у нас є текстова мітка та два елементи редагування тексту в горизонтальному рядку. Мітка не вказана макет-вага, тому він займає мінімальний простір, необхідний для візуалізації. Якщо розмір_схема кожного з двох елементів редагування тексту встановлений на 1, решта ширини у батьківському макеті будуть розділені між ними порівну (оскільки ми вважаємо, що вони однаково важливі). Якщо перший має макет_в вазі 1, а другий має макет_ вагу 2, то третина решти місця буде відведена першому, а дві третини - другому (оскільки ми стверджуємо, що другий важливіший).



4

Додатково :

Для verticalорієнтації не забудьте встановити height0dp

android:layout_height="0dp"

Для horizontalорієнтації не забудьте встановити width0dp

android:layout_width="0dp"

3

Будь ласка, подивіться на вагу суми LinearLayout та розмір ваги кожного перегляду. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Їх layout_height обидва 0px, але я не впевнений, що це відповідає

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="4">

<fragment android:name="com.example.SettingFragment"
    android:id="@+id/settingFragment"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    />

<Button
    android:id="@+id/dummy_button"
    android:layout_width="match_parent"
    android:layout_height="0px"
    android:layout_weight="2"
    android:text="DUMMY"
    />
</LinearLayout>

Будь ласка, подивіться на вагу суми LinearLayout та розмір ваги кожного перегляду. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" Їх layout_height обидва 0px, але я не впевнений, що це актуально.
Ming Leung

0

Поєднання обох відповідей від

Flo & rptwsthi і roetzi,

Не забудьте змінити своє layout_width=0dp/px, інакше layout_weightповедінка буде діяти зворотно, якщо найбільша кількість займає найменший простір, а найменше займає найбільше місце.

Крім того, деяка комбінація ваг призведе до того, що деякий макет не може бути показаний (оскільки він зайняв простір).

Остерігайся цього.



-1

Як випливає з назви, вага макета визначає, яку кількість або відсоток місця певне поле чи віджет повинен займати екранний простір.
Якщо ми задаємо вагу в горизонтальній орієнтації, то ми повинні вказати layout_width = 0px.
Аналогічно, якщо ми задаємо вагу у вертикальній орієнтації, то ми повинні вказати layout_height = 0px.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.