Почему android: layout_width = ”0px” для фрагментов? - PullRequest
8 голосов
/ 10 сентября 2011

Ширина макета всегда равна нулю в примерах фрагментов.Что стоит за этим значением?

Ответы [ 2 ]

33 голосов
/ 10 сентября 2011

Чтобы надеяться объяснить, взгляните на Design Philosophy для фрагментов в Руководстве разработчика.

Если вы посмотрите на изображение, слева показано, как телефон отобразит начальное действие A, которое затем запустит действие B при выборе элемента в списке.

Справа, однако, показано, как эти два действия могут быть показаны как фрагменты одновременно. Обратите внимание, что фрагмент A занимает 1/3 экрана, а фрагмент B занимает 2/3 экрана.

Теперь посмотрите на XML для этого макета из Добавление фрагмента к действию из той же статьи в Руководстве разработчика ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

Вы можете видеть, что оба фрагмента имеют layout_width 0dp, но каждый из них также имеет атрибут layout_weight. Первый имеет вес 1, а второй вес 2.

Короче говоря, при использовании подобного макета установка 'width' равным 0 означает, что вы не хотите явно применять ширину и что ОС должна вычислять относительные ширины как доли от общего веса. Другими словами, 1 + 2 = 3 (общий вес), но первое действие требует ширину 1 / общий вес = 1/3 ширины экрана, а фрагмент B хочет 2 / общая ширина = 2/3 ширины экрана.

Теперь предположим, что вы добавили третий фрагмент, который также имеет width = 0dp и weight = 2. В этом случае общий вес составляет 1 + 2 + 2 = 5, а первый фрагмент будет иметь относительную ширину 1/5, а два других фрагмента - 2/5 экрана или 20% / 40% / 40%.

0 голосов
/ 01 июня 2015

Это сработало для меня:

  1. Суммирование всех весов в макете. В примере, который опубликовал Squonk, есть 2 фрагмента, а общий вес равен 3.

  2. Фрагмент ArticleListFragment имеет вес = 1, что означает, что Размер экрана будет составлять 1/3 (3 - общий вес).

  3. Фрагмент ArticleReaderFragment имеет вес = 2, что означает, что размер будет составлять 2/3 от размера экрана.

Надеюсь, это поможет.

...