Android: простой вопрос LinearLayout и fill_parent - PullRequest
6 голосов
/ 24 декабря 2009

Я уверен, что упускаю что-то простое ...

Справочная информация:

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

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

    <CheckBox android:id="@+id/check_box"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/check_box_text" />

    <TextView android:id="@+id/dummy_display"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/dummy_label" />

</LinearLayout>

Мои тесты (просто чтобы понять, как все работает):

  • Сценарий 1) Когда я устанавливаю CheckBox s layout_height на "fill_parent", CheckBox занимает весь экран и выравнивается по центру (т.е. - TextView исчезает).

  • Сценарий 2) Если I вместо установить TextView s layout_height на "fill_parent", CheckBox действительно НЕ исчезнет. На самом деле ничего не исчезает, и макет выглядит так же, как и в приведенном выше xml, где все перемещается в верхний левый угол.

Вопрос (и комментарии):

Почему сценарий 1 работает так, как работает?

Такое поведение мне кажется несовместимым. Я подумал, что fill_parent должен позволять элементу заполнять все пространство, доступное в родительском элементе. Поэтому мне кажется, что TextView должен получить то место, которое ему нужно , необходимое (поскольку оно wrap_content), но CheckBox должно занять оставшееся пространство (поэтому TextView будет вынужден в нижней части экрана, но не невидимым). Другими словами ... Сценарий 2 имеет для меня смысл, а сценарий 1 - нет.

Пожалуйста, объясните: -).

Спасибо

Tom

1 Ответ

13 голосов
/ 24 декабря 2009

LinearLayout измеряет детей как один шаг один за другим, так что в вашем первом примере он видит, что первый ребенок хочет иметь всю доступную высоту, которую он ему дает. Во втором примере он предоставляет все доступное место второму ребенку. Если вы хотите, чтобы флажок занимал все место, кроме места, необходимого для текстового поля, вы должны изменить флажок layout_height в wrap_parent и установить свойство layout_weight каждого дочернего элемента; вес макета указывает, сколько свободного места после всех измеренных дочерних элементов должно быть добавлено к каждому из них. Чтобы быть более конкретным, как это работает по шагам:
1) Родитель LinearLayout сообщает линейному макету, насколько он может быть большим
2) LinearLayout запрашивает все дочерние элементы в том порядке, в котором они указали свои параметры макета, и распределяет доступное пространство.
3) Если какое-либо свободное пространство все еще доступно, оно распределяет его между детьми в соответствии с их весом (вес макета составляет от 0 до 1, 0 - по умолчанию)
Надеюсь, это поможет
Edit:
Я проверил исходный код LinearLayout и выяснил, что если линейный макет имеет параметры макета FILL_PARENT, а не код измерения нулевого веса, то установит высоту макета на WRAP_CONTENT, а затем распределит пространство между всеми дочерними элементами в соответствии с весами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...