2011-05-11 3 views
4

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

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

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

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

Спасибо!

EDIT: Похоже, что 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> 

Результаты: enter image description here

Вес 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> 

Результаты: enter image description here

** Вес 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> 

Результаты: enter image description here

ответ

1

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

+0

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

+0

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

+0

@dmon: Я обновил свой первоначальный пост с примерами. – nbarraille

3

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

3

Для 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 должной.

+0

После нескольких часов работы это решение сработало! – Massimo

Смежные вопросы