Компоновка Android layout_weight

#android #android-layout #android-linearlayout

#Android #android-layout #android-linearlayout

Вопрос:

Я пытаюсь создать макет Android, используя layout_weight , чтобы соответствовать устройствам всех размеров, и у меня возникли некоторые проблемы с пониманием его конфигурации.

Я заметил, что изменение layout_width / layout_height повлияло на layout_weight компоновку, но я не понимаю, как.

Допустим, например, я хочу иметь вертикаль, LinearLayout разделенную на три внутренних элемента LinearLayout таким образом, чтобы верхний и нижний заполняли 25% экрана, а средний — 50%, и это не должно зависеть от содержимого внутренних макетов. (Если содержимое внутреннего LinearLayout слишком велико, это не должно сдвигать другие макеты)

Для того, чтобы сделать это, должен ли я установить layout_height атрибут inner LinearLayout на fill_parent или на wrap_content ?

Спасибо!

РЕДАКТИРОВАТЬ: Похоже, layout_weight обратно пропорционален размеру, который будет занимать макет.

3 примера:

Вес 1/1/1 (работает так, как я ожидал)

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/mainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
        <LinearLayout
            android:id="@ id/layout1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#FF0000"/> //RED
        <LinearLayout
            android:id="@ id/layout2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#00FF00"/> //GREEN
        <LinearLayout
            android:id="@ id/layout3"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#0000FF"/> //BLUE
</LinearLayout>
  

Результаты:
введите описание изображения здесь

Вес 1/2/1 (Почему, о, почему?)

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/mainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
        <LinearLayout
            android:id="@ id/layout1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#FF0000"/> //RED
        <LinearLayout
            android:id="@ id/layout2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="2"
            android:background="#00FF00"/> //GREEN
        <LinearLayout
            android:id="@ id/layout3"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:background="#0000FF"/> //BLUE
</LinearLayout>
  

Результаты:
введите описание изображения здесь

** Вес 3/2/3 (то, что я намеревался сделать с 1/2/1):

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@ id/mainLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
        <LinearLayout
            android:id="@ id/layout1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="3"
            android:background="#FF0000"/> //RED
        <LinearLayout
            android:id="@ id/layout2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="2"
            android:background="#00FF00"/> //GREEN
        <LinearLayout
            android:id="@ id/layout3"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="3"
            android:background="#0000FF"/> //BLUE
</LinearLayout>
  

Результаты:введите описание изображения здесь

Ответ №1:

Вы можете попытаться установить layout_height = 0dp

Ответ №2:

Чтобы layout_weight работать должным образом (и документировано), вы должны не устанавливать layout_height значение ни fill_parent ни match_parent .

Пример справа на http://developer.android.com/guide/topics/ui/layout/linear.html#Weight показан пример, для которого layout_height установлено значение 0dp . Однако, не устанавливая его вообще или устанавливая его на wrap_content также делает layout_weight работу, как ожидалось.

Ответ №3:

Вы должны установить layout_height для всех трех внутренних макетов в значение «fill_parent», а затем изменить их веса, чтобы они выглядели так, как вы хотите.

Комментарии:

1. @Egor: Я пытался это сделать, но я не понимаю, как layout_weight действует в этом случае: если я поставлю 1/1/1, три части будут равны. Но если я поставлю 1/2/1, я не увижу второго, и экран просто разделится на 50% от первого макета и 50% от третьего макета. Как это работает?

2. @nbarraille : вам следует опубликовать соответствующий макет, чтобы мы могли лучше оценить, что не так в этом конкретном случае, потому что пространство должно быть распределено так, как вы указали.

3. @Enbarraille: Вы также могли бы установить вес 2: 1: 2, а не 3: 2: 3. Я также нахожу странным, как веса обратно пропорциональны. Кажется антиинтуитивным

4. @nbarraille: Отличные образцы! Да, я думаю, вы ошиблись, чем меньше число, тем выше важность. Тем не менее, я все еще не знаю, почему 1/2/1 полностью избавляется от среднего контейнера. Я думаю, это может быть как-то связано с тем, что в нем нет содержимого. Вы пробовали использовать три кнопки с текстом, посмотреть, исчезает ли средняя по-прежнему?

5. @dmon: Наличие кнопки в макете не помогает, вторая кнопка не отображается для 1/2/1.