Відповіді:
За допомогою layout_weight
вас можна вказати співвідношення розмірів між кількома переглядами. Наприклад, у вас є MapView
та, table
який повинен показати деяку додаткову інформацію на карті. Карта повинна використовувати 3/4 екрана, а таблиця повинна використовувати 1/4 екрана. Тоді ви будете встановити layout_weight
з map
до 3 і layout_weight
зtable
1.
Для його роботи також потрібно встановити висоту або ширину (залежно від вашої орієнтації) 0 пікс.
Коротше кажучи, layout_weight
вказує, скільки додаткового місця в макеті має бути виділено Перегляду.
LinearLayout підтримує призначення ваги окремим дітям. Цей атрибут присвоює перегляду значення "важливості" і дозволяє йому розширюватися, щоб заповнити будь-який залишився простір у батьківському поданні. Вага за замовчуванням у перегляді дорівнює нулю.
Загалом, формула така:
простір, призначений дитині = (індивідуальна вага дитини) / (сума ваги кожної дитини в лінійному макеті)
Якщо є три текстові поля, і два з них оголошують вагу 1, а третьому немає ваги (0), то решта місця призначається таким чином:
1-е текстове поле = 1 / (1 + 1 + 0)
2-е текстове поле = 1 / (1 + 1 + 0)
3-е текстове поле = 0 / (1 + 1 + 0)
Скажімо, у нас є текстова мітка та два елементи редагування тексту в горизонтальному рядку. Мітка не layout_weight
вказана, тому вона займає мінімальний простір, необхідний для візуалізації. Якщо layout_weight
для кожного з двох елементів редагування тексту встановлено 1, решта ширини у батьківському макеті буде розділена між ними порівну (оскільки ми стверджуємо, що вони однаково важливі).
Розрахунок:
1-я мітка = 0 / (0 + 1 + 1)
2-е текстове поле = 1 / (0 + 1 + 1)
3-е текстове поле = 1 / (0 + 1 + 1)
Якщо натомість у першому текстовому полі розміщено layout_weight
1, а у другому текстовому полі - layout_weight
2, то одна третина решти місця буде надана першій, а дві третини - другій (тому що ми вимагаємо другий один важливіший).
Розрахунок:
1-я мітка = 0 / (0 + 1 + 2)
2-е текстове поле = 1 / (0 + 1 + 2)
3-е текстове поле = 2 / (0 + 1 + 2)
android:layout_width="0px"
це важливо. Крім того, ваги не повинні бути цілими числами.
weightSum
приходить картина? Чи має це щось спільне layout_weight
?
додаючи до інших відповідей, найголовніше, щоб змусити це працювати, це встановити ширину (або висоту) макета на 0px
android:layout_width="0px"
інакше ви побачите сміття
Якщо існує декілька представлень, що охоплюють а 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>
layout_weight
розповідає Android, як розповсюджувати свої View
файли в LinearLayout
. Потім Android спочатку розраховує загальну пропорцію, необхідну для всіх View
s, які мають вказану вагу, і розміщує кожного View
відповідно до того, який саме фрагмент екрана він вказав. У наступному прикладі, Android бачить , що TextView
їй є layout_weight
з 0
(це за замовчуванням) і EditText
s має 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>
Схоже:
і
Думайте, що так, буде простіше
Якщо у вас є 3 кнопки, а їх вага відповідно 1,3,1, вона працюватиме як таблиця в HTML
Укажіть 5 частин для цього рядка: 1 частина для кнопки 1, 3 частини для кнопки 2 та 1 частина для кнопки 1
З повагою,
одне з найкращих пояснень для мене було це (з підручника Android, шукайте крок 7) :
layout_weight використовується в LinearLayouts для присвоєння "важливості" Переглядам у межах макета. Усі представлення за замовчуванням layout_weight zero, тобто вони займають лише стільки місця на екрані, скільки потрібно для відображення. Призначення значення, що перевищує нуль, розділить решту доступного простору у батьківському перегляді відповідно до значення макета кожного перегляду та його відношення до загальної ваги макета, визначеного в поточному макеті для цього та інших елементів Перегляду.
Для прикладу: скажімо, у нас є текстова мітка та два елементи редагування тексту в горизонтальному рядку. Мітка не вказана макет-вага, тому він займає мінімальний простір, необхідний для візуалізації. Якщо розмір_схема кожного з двох елементів редагування тексту встановлений на 1, решта ширини у батьківському макеті будуть розділені між ними порівну (оскільки ми вважаємо, що вони однаково важливі). Якщо перший має макет_в вазі 1, а другий має макет_ вагу 2, то третина решти місця буде відведена першому, а дві третини - другому (оскільки ми стверджуємо, що другий важливіший).
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight визначає, скільки місця повинен отримати управління відповідно до інших елементів управління.
Будь ласка, подивіться на вагу суми 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>
Поєднання обох відповідей від
Flo & rptwsthi і roetzi,
Не забудьте змінити своє layout_width=0dp/px
, інакше layout_weight
поведінка буде діяти зворотно, якщо найбільша кількість займає найменший простір, а найменше займає найбільше місце.
Крім того, деяка комбінація ваг призведе до того, що деякий макет не може бути показаний (оскільки він зайняв простір).
Остерігайся цього.
Додавання автоматично android:autoSizeTextType="uniform"
змінить розмір тексту для вас
Як випливає з назви, вага макета визначає, яку кількість або відсоток місця певне поле чи віджет повинен займати екранний простір.
Якщо ми задаємо вагу в горизонтальній орієнтації, то ми повинні вказати layout_width = 0px
.
Аналогічно, якщо ми задаємо вагу у вертикальній орієнтації, то ми повинні вказати layout_height = 0px
.