使用layout_gravity =“bottom”放置在LinearLayout的底部

时间:2011-07-29 15:16:18

标签: android android-layout

我想在LinearLayout的底部放置一个布局,但我似乎无法让它工作。我知道我可以使用RelativeLayout来做这件事,但我应该可以使用LinearLayout,不应该吗?

编辑:实际上这比我想象的更令人困惑。下面的布局是简化的。实际上,我在3.0之前的设备上使用片段,并使用兼容层。

我使用Hierarchy Viewer来检查发生了什么,并发现android.support.v4.app.NoSaveStateFrameLayout已添加到我的布局中,并且该布局将layout_height设置为wrap_content。这似乎是造成我的问题的原因,但我还没弄清楚如何修复它。

具体来说,为什么这不起作用? layout_gravity不应该把它放在底部吗?

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

BTW,将layout_height更改为fill_parent或设置layout_weight似乎也不起作用。我只是想更好地了解发生了什么,因为很明显我错过了一些重要的东西。感谢。

5 个答案:

答案 0 :(得分:17)

首先是个好问题。

Android在这种情况下表现得很奇怪。

如果您选择了父线性布局的水平方向,则可以通过设置其layoug_gravity = bottom将其子组件设置在底部。假设您在该水平线性布局中添加了2个文本视图,并且第二个textview的layout_gravity是底部,那么它将设置为bottom但它的工作方式就像它设置在其他列的底部然后是第一个文本视图。 注意:当其parent linearlayout为水平但您无法看到其结果时,可以设置textview的layout_gravity =“left”或“right”。

相反,如果您选择了父线性布局的垂直方向,则可以使用layout_gravity将其子组件设置为左侧或右侧。但是第二个文本视图将显示在你可以说你设置的左右重力的下一行。 注意您可以设置textview的layout_gravity =“top”或“bottom”,当它的线性布局是垂直的但你看不到它的结果。

尝试按照上面的说明制作样本xml设计,以便更好地了解。

奇怪但真实!尝试了解这种行为。 :)

答案 1 :(得分:10)

所以我解决了这个问题。这是一个由两部分组成的解决方案:

首先,在不使用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>

这本身并没有解决我的问题,因为我有一个带有layout_width =“wrap_content”的NoSaveStateFrameLayout作为父视图,所以我需要先修复它。我正在使用基于精彩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 :(得分:7)

只需在底部和剩下的部分之间添加空格:

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

答案 3 :(得分:0)

LinearLayout只会堆放在那里的东西。由于它是垂直的,它将以垂直方式一个接一个地放置物品。你能改变androidLayout的android:gravity,而不是嵌套的layout_gravity,看看是否有效。

RelativeLayout当然应该是第一种方式,但你说你不想这样做。这有什么理由吗?

答案 4 :(得分:0)

根据https://stackoverflow.com/a/13366783/513038,您可能需要将父LinearLayout设置为android:baselineAligned="false"。在我的案例中工作。