Хочу знати: що таке андроїд: вагасум і вага макета, і як вони працюють?
Хочу знати: що таке андроїд: вагасум і вага макета, і як вони працюють?
Відповіді:
За документацією android:weightSum
визначається максимальна сума ваги та обчислюється як сума layout_weight
всіх дітей, якщо не зазначено прямо.
Розглянемо приклад LinearLayout
з горизонтальною орієнтацією та 3 ImageViews
всередині неї. Тепер ми хочемо, щоб вони ImageViews
завжди займали рівний простір. Щоб домогтися цього, ви можете встановити значення layout_weight
кожного ImageView
на 1, а кількість weightSum
обчислень дорівнює 3, як показано в коментарі.
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
<!-- android:weightSum="3" -->
android:orientation="horizontal"
android:layout_gravity="center">
<ImageView
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"/>
.....
weightSum
корисно для правильного відображення макета для будь-якого пристрою, що не відбудеться, якщо встановити ширину та висоту безпосередньо.
Додавши до відповіді суперМами та Джеффа,
Якщо в LinearLayout є 2 перегляди, перший з макетом-вагою 1, другий з макетом_ вагою 2 і не вказано weightSum, за замовчуванням weightSum обчислюється як 3 (сума ваг дітей) і перший погляд займає 1/3 місця, а другий 2/3.
Однак, якби ми вказали weightSum як 5, перший займе 1/5 місця, а другий - 2/5. Таким чином, 3/5 місця буде зайнято макетом, а решта порожня.
Сума ваги працює саме так, як ви хочете (як і інші відповіді, вам не потрібно підсумовувати всі ваги на батьківському макеті). На дитячому перегляді вкажіть вагу, яку ви бажаєте набрати. Не забудьте вказати
android:layout_width="0dp"
Далі наводимо приклад
<LinearLayout
android:layout_width="500dp"
android:layout_height="20dp" >
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="@android:color/holo_green_light"
android:gravity="center"
android:text="30%"
android:textColor="@android:color/white" >
</TextView>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:background="@android:color/holo_blue_bright"
android:gravity="center"
android:text="20%"
android:textColor="@android:color/white" >
</TextView>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="5"
android:background="@android:color/holo_orange_dark"
android:gravity="center"
android:text="50%"
android:textColor="@android:color/white" >
</TextView>
</LinearLayout>
Це буде виглядати приблизно так
Документація каже , що краще , і включає в себе приклад, (підсвічування шахти).
android: weightSum
Визначає максимальну вагову суму. Якщо не визначено, сума обчислюється шляхом додавання макет_ ваги всіх дітей. Це може бути використано, наприклад, для того, щоб дати одній дитині 50% всього наявного простору, надавши їй масу ваги 0,5 і встановивши weightSum до 1,0.
Отже, щоб виправити приклад superM, припустимо, у вас LinearLayout
горизонтальна орієнтація, яка містить два ImageViews
та a TextView
. Ви визначаєте, TextView
щоб мати фіксований розмір, і вам хотілося б дваImageViews
зайняли залишок місця однаково.
Для цього ви застосуєте layout_weight
1 для кожного ImageView
, жодного на TextView
, а weightSum
2,0 для LinearLayout
.
Після деяких експериментів я думаю, що алгоритм для LinearLayout такий:
Припустимо, що weightSum
встановлено значення. Справа відсутності обговорюється пізніше.
По-перше, розділіть на weightSum
кількість елементів, з якими match_parent
або fill_parent
в розмірності LinearLayout (наприклад, layout_width
для orientation="horizontal"
). Ми будемо називати це значення коефіцієнтом ваги для кожного елемента. Значення за замовчуванням weightSum
- 1,0, тому множник ваги за замовчуванням - 1/n
де n
кількість fill_parent
елементів; wrap_content
елементи не сприяють n
.
Наприклад, коли weightSum
це 60, а є 3 fill_parent
елементи, коефіцієнт ваги дорівнює 20. Коефіцієнт ваги - це значення за замовчуванням, наприклад, layout_width
якщо атрибут відсутній.
По-друге, обчислюється максимально можливе розширення кожного елемента. Спочатку wrap_content
елементи обчислюються відповідно до їх вмісту. Їх розширення вираховується з розширення батьківського контейнера. Ми зателефонуємо залишкові expansion_remainer
. Цей залишок розподіляється між fill_parent
елементами відповідно до їх layout_weight
.
По-третє, розширення кожного fill_parent
елемента обчислюється як:
Приклад:
Якщо weightSum
дорівнює 60, а є 3 fill_parent
елементи з вагами 10, 20 і 30, їх розширення на екрані становить 2/3, 1/3 та 0/3 батьківського контейнера.
weight | expansion
0 | 3/3
10 | 2/3
20 | 1/3
30 | 0/3
40 | 0/3
Мінімальне розширення обмежене на 0. Максимальне розширення обмежене на розмір батьків, тобто ваги обмежені в 0.
Якщо елемент встановлений wrap_content
, його розширення розраховується спочатку, а решта розширення підлягає розподілу між fill_parent
елементами. Якщо weightSum
це встановлено, це призводить до layout_weight
того, що не впливає на wrap_content
елементи. Однак wrap_content
елементи все одно можуть бути витіснені з видимої області елементами, вага яких менший (наприклад, між 0-1 для weightSum
= 1 або між 0-20 для вищевказаного прикладу).
Якщо не weightSum
вказано жодне , воно обчислюється як сума всіх layout_weight
значень, включаючи елементи з wrap_content
набором! Отже, layout_weight
встановивши wrap_content
елементи, може вплинути на їх розширення. Наприклад, негативна вага зменшить інші fill_parent
елементи. Перед тим, як fill_parent
елементи будуть викладені, чи буде застосована вищезазначена формула до wrap_content
елементів, при цьому максимально можливим розширенням буде їх розширення відповідно до обгорнутого вмісту. Ці wrap_content
елементи будуть усадка, а потім максимально можливе розширення для решти fill_parent
елементів обчислюються і розподілено.
Це може призвести до неінтуїтивних результатів.
Якщо не визначено, сума обчислюється шляхом додавання макет_ ваги всіх дітей. Це може бути використано, наприклад, для того, щоб дати одній дитині 50% всього наявного простору, надавши їй масу ваги 0,5 і встановивши weightSum до 1,0. Повинно бути значенням з плаваючою комою, наприклад "1,2"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_rel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="2.0" >
<RelativeLayout
android:id="@+id/child_one"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="#0000FF" >
</RelativeLayout>
<RelativeLayout
android:id="@+id/child_two"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:background="#00FF00" >
</RelativeLayout>
</LinearLayout>
Одне, що, схоже, ніхто більше не згадував: скажімо, у вас є вертикаль LinearLayout
, тому для того, щоб ваги в макеті / елементі / перегляді всередині нього працювали на 100% належним чином - всі вони повинні мати layout_height
властивість (яка повинна існувати у вашому xml файл) встановлено на 0dp
. Здається, будь-яка інша цінність в деяких випадках зіпсує речі.
Вага макета працює як співвідношення. Наприклад, якщо є вертикальний макет і є два елементи (такі як кнопки або перегляд тексту), один має макет 2 і другий має макет 3 відповідно. Тоді 1-й елемент займе 2 з 5 частин екрана / макета, а інший 3 з 5 частин. Тут 5 - вагова сума. тобто сума ваги ділить весь макет на визначені частини. А Вага макета визначає, яку частку займає конкретний предмет із загальної попередньо визначеної суми ваги. Вагова сума також може бути оголошена вручну. Кнопки, перегляд тексту, редакційні тексти тощо - це впорядковано за допомогою вагової суми та ваги макета при використанні лінійних макетів для дизайну інтерфейсу.
З документації розробника
Це можна використовувати, наприклад, для надання єдиній дитині 50%
загального доступного простору, надавши їй масу_ ваги 0.5
та встановивши weightSum 1.0
.
Доповнення до відповіді @Shubhayu
відпочинок 3/5
може бути використаний для інших дочірніх макетів, які дійсно не потребують певної частини макета, що містить.
це потенційне використання android:weightSum
майна.
weightSum
. Поведінка у вашому прикладі буде ідентичноюweightSum
опущеній, і насправді weightSum не повинен бути вказаний у цьому сценарії. Документація каже,weightSum Defines the maximum weight sum. If unspecified, the sum is computed by adding the layout_weight of all of the children.