#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.