Відповіді:
За допомогою 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_weight1, а у другому текстовому полі - layout_weight2, то одна третина решти місця буде надана першій, а дві третини - другій (тому що ми вимагаємо другий один важливіший).
Розрахунок:
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 спочатку розраховує загальну пропорцію, необхідну для всіх 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>
Схоже:
і

Думайте, що так, буде простіше
Якщо у вас є 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.