Использование layout_gravity = "bottom" для размещения внизу LinearLayout

Я хотел бы разместить макет в нижней части LinearLayout, но я не могу заставить его работать. Я знаю, что могу использовать RelativeLayout для этого, но я должен использовать LinearLayout, не так ли?

EDIT: На самом деле это более запутанно, чем я думал. Макет ниже упрощен. На самом деле, я использую фрагменты на устройстве до 3.0, с уровнем совместимости.

Я использовал Hierarchy Viewer для проверки того, что происходит, и обнаружил, что в мой макет добавлен файл android.support.v4.app.NoSaveStateFrameLayout, и этот макет имеет layout_height, установленный в wrap_content. Кажется, это то, что вызывает мою проблему, но я еще не понял, как это исправить.

В частности, почему это не работает? Не следует ли расположить его в нижней части?

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

        ... stuff here ...

        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="horizontal">

            ... more stuff here ...

     </LinearLayout>
</LinearLayout>

Кстати, изменение layout_height для fill_parent или установки layout_weight тоже не работает. Я просто хочу лучше понять, что происходит, потому что я явно пропускаю что-то важное. Спасибо.

Ответ 1

Итак, я решил проблему. Это двухкомпонентное решение:

Во-первых, способ сделать это, не используя LinearLayout, - это обеспечить вес элемента выше, чтобы он занимал все пустое пространство. Кстати, вы можете увидеть этот пример в демонстрациях API: http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_3.html

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

        ... stuff here ...
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:weight="1"/>
        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            ... more stuff here ...

     </LinearLayout>
</LinearLayout>

Это само по себе не решило мою проблему, так как у меня был NoSaveStateFrameLayout с layout_width = "wrap_content" в качестве родительского представления, и поэтому мне нужно было сначала получить это исправление. Я использую код, основанный на замечательном Google I/O App, и когда я искал код для NoSaveStateFrameLayout, я нашел это:

// For some reason, if we omit this, NoSaveStateFrameLayout thinks we are
// FILL_PARENT / WRAP_CONTENT, making the progress bar stick to the top of the activity.
mRootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT));

Спасибо за замечательный комментарий Google!!! Я добавил это в свой источник, и все отлично поработало!

Мораль истории: Hierarchy Viewer и комментарии - ваши друзья.

Ответ 2

Прежде всего, хороший вопрос.

Android ведет себя, мы можем сказать, что это странно в такой ситуации.

если вы выбрали горизонтальную ориентацию родительской ориентации горизонтальной, вы можете установить ее дочерний компонент внизу, установив его layoug_gravity = bottom. предположим, что вы добавили 2 текстовых вида в горизонтальный линейный макет, а второй textview layout_gravity - снизу, тогда он будет установлен снизу, но он работает так, как он установлен снизу в другом столбце, а затем в первом текстовом представлении. ПРИМЕЧАНИЕ: вы можете установить textview layout_gravity = "left" или "right", если его parent linearlayout горизонтально, но вы не можете увидеть его результат.

Противоположно, если вы выбрали вертикальную ориентацию parent linearlayout вертикально, вы можете установить ее дочерний компонент слева или справа, используя layout_gravity. но второе текстовое изображение будет показано в следующей строке с левой или правой степенью тяжести, как вы уже установили. ПРИМЕЧАНИЕ вы можете установить textview layout_gravity = "top" или "bottom", когда его линейный макет вертикальный, но вы не можете увидеть его результат.

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

Странно, но правда!!! Попытайтесь понять это поведение.:)

Ответ 3

Просто добавьте пробел между тем, что вы хотите внизу и всем остальным:

        <Space
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

Ответ 4

LinearLayout будет просто складывать вещи по мере их размещения. Поскольку он является вертикальным, он будет размещать предметы один за другим по вертикали. Можете ли вы изменить андроид: гравитация linearLayout, а не layout_gravity вложенного и посмотреть, работает ли это.

RelativeLayout, конечно, должен быть первым, но вы заявили, что не хотите этого делать. Есть ли причина для этого?

Ответ 5

Возможно, что в соответствии с fooobar.com/info/138940/... вам нужно установить родительский LinearLayout на android:baselineAligned="false". Работал в моем случае.