Подтвердить что ты не робот

Андроид: макет начального вопроса

Когда у меня есть следующее, он показывает верхний макет с четырьмя цветами имеет гораздо меньшую площадь, чем нижняя область макета.

Согласно http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout, когда вы добавляете больше в layout_weight, он должен увеличить область, но она уменьшается в коде.

Любая помощь будет оценена.

Спасибо заранее.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

  <LinearLayout
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="4">
      <TextView
          android:text="red"
          android:gravity="center_horizontal"
          android:background="#aa0000"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="3"/>
      <TextView
          android:text="green"
          android:gravity="center_horizontal"
          android:background="#00aa00"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
      <TextView
          android:text="blue"
          android:gravity="center_horizontal"
          android:background="#0000aa"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
      <TextView
          android:text="yellow"
          android:gravity="center_horizontal"
          android:background="#aaaa00"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:layout_weight="1"/>
  </LinearLayout>

  <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1">
    <TextView
        android:text="row one"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:text="row two"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:text="row three"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <TextView
        android:text="row four"
        android:textSize="15pt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
  </LinearLayout>

</LinearLayout>
4b9b3361

Ответ 1

У меня была та же проблема. Хитрость заключается не в том, чтобы использовать "wrap_content" или "fill_parent" для элементов управления, для которых вы устанавливаете вес. Вместо этого установите layout_height в 0px (когда внутри вертикального макета), а затем дочерние элементы управления будут распределены по весовым значениям.

Ответ 2

Если вы получили ошибку как

Ошибка

Подозрительный размер: это сделает вид невидимым, вероятно, предназначенным для макета...

не забудьте установить правильный параметр на android:orientation в родительском

Ответ 3

Если вы используете fill_parent в LinearLayout, макет займет как можно больше места, и все элементы макета, определенные позже, будут иметь дело с оставшимся пространством.

Если вы установите высоту обоих из вас LinearLayouts на wrap_content, вес должен работать как задокументированный.

Ответ 4

Я знаю, что это поздно, но, надеюсь, это помогает людям:

Используйте android:weightSum для родителя. Вот ссылка на dev docs.

http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:weightSum

Используйте android:weightSum из 1.0 для родителя, а затем используйте 0.x в дочерних представлениях с android:layout_weight, чтобы использовать это соотношение пространства.

Ответ 5

Основываясь на том, что сказал Януш, если вы используете fill_parent, вы можете установить android: layout_weight, чтобы "разделить" всю область между несколькими элементами макета.

Макет_средства не увеличивает область, он увеличивает ее "право" на область. но и относительно родителя. Если у вас есть родительский элемент с layout_height = fill_parent, с layout_weight = 0, а у родителя есть брат с тем же, установка layout_weight = 1 для одного из дочерних элементов не влияет на родителя.

Как родительский, так и родственный брат будут занимать 50% доступной области, которую они могут заполнить.

Ответ 6

Решение состоит в том, чтобы установить layout_height в 0px при использовании layout_weight.

Но почему вы наблюдаете это, по-видимому, странное/обратное поведение?

В ближайшее время: оставшееся пространство отрицательное, и поэтому ребенок с весом 4 получает больше отрицательного пространства, а высота уменьшается.

Подробнее:

Предположим, что высота вашего родительского вертикального макета составляет 100 пикселей.

Высота макета для каждого дочернего элемента fill_parent (то есть каждый ребенок также имеет высоту 100 пикселей)

Общая высота всего ребенка = 2 * 100 пикселей

Оставшаяся высота = 100 - (2 * 100) = -100 пикселей (отрицательная)

Теперь позвольте распределить эту оставшуюся высоту между дочерними. Первый получит большую часть: 80% (т.е. -100 * 4/(4 + 1)). Второй ребенок получает 20% (т.е. -100 * 1/(4 + 1))

Теперь вычислите полученную высоту:

ребенок 1:100 + (-80) = 20px

ребенок 2: 100 + (-20) = 80px

Ничего странного здесь, только математика. Просто имейте в виду, что оставшееся пространство может быть отрицательным! (или установите высоту явно в 0, как рекомендуется)

Ответ 7

В свойствах линейного макета измените ширину макета на "fill_parent" вместо "wrap_content" надеюсь, что это поможет.

Ответ 8

Если ориентация linearlayout является вертикальной, установите layout_height как 0dp. В случае горизонтальной компоновки установите layout_width как 0dp.

Если мы не следуем вышеприведенным правилам, представление имеет тенденцию занимать пространство в соответствии с указанными атрибутами и, следовательно, выравнивание не соответствует ожиданиям.