Android线性布局-如何使元素位于视图的底部?


75

TextView想将其固定在LinearLayout与垂直排列的元素一起使用的景观活动的底部。

我已经设置android:gravity="bottom"了文本视图,但是它仍然喜欢恰好位于LinearLayout我不希望它执行的操作的最后一个元素之下。

有什么建议?


只需android:gravity="bottom"从中删除TextView并将其添加到中即可LinearLayout。您的问题将得到解决。
堆栈溢出

Answers:


109

更新:我仍然对此问题持否定态度,这仍然是公认的答案,我认为我的回答很差。本着确保提供最佳信息的精神,我决定更新此答案。

在现代的Android中,我将使用ConstraintLayout该功能。它更高效,更直接。

<ConstraintLayout>
   <View
      android:id="@+id/view1"
      ...other attributes elided... />
   <View
      android:id="@id/view2"        
      app:layout_constraintTop_toBottomOf="@id/view1" />
      ...other attributes elided... />

   ...etc for other views that should be aligned top to bottom...

   <TextView
    app:layout_constraintBottom_toBottomOf="parent" />

如果您不想使用ConstraintLayout,则将LinearLayout与扩展视图一起使用是一种处理占用额外空间的简单明了的好方法(请参阅@Matthew Wills的回答)。如果您不想在底视图上方扩展任何视图的背景,则可以添加不可见的视图以占用空间。

我最初给出的答案有效,但效率不高。对于单个顶层布局而言,效率低下可能并不重要,但是在ListView或中这将是一个糟糕的实现RecyclerView,并且没有任何理由这样做,因为存在更好的大致相同级别的方法努力和复杂性,如果不是更简单的话。

将TextView从LinearLayout中取出,然后将LinearLayout和TextView放在RelativeLayout中。将属性添加android:layout_alignParentBottom="true"到TextView。除去上述属性之外的所有名称空间和其他属性:

<RelativeLayout>
  <LinearLayout>
    <!-- All your other elements in here -->
  </LinearLayout>
  <TextView
    android:layout_alignParentBottom="true" />
</RelativeLayout>

这确实解决了问题。我为线性布局中的元素使用了特定的高度
Androider 2011年

1
如果要切换到RelativeLayout,最好完全放弃LinearLayout,从而避免不必要的嵌套布局?
erichamion 2011年

3
对于诸如ListView的布局膨胀100或1000倍的布局,这肯定是。对于一个活动的单个布局,它的影响并不大。您需要权衡程序员的便利性,而对性能的影响却很小。
Brian Cooley

1
这不适用于LinearLayout中的Button。
IgorGanapolsky

119

您将必须通过设置上面的视图之一来填充剩余空间android:layout_weight="1"。这会将您的最后一个视图下推至底部。

这是我的意思的简要概述:

<LinearLayout android:orientation="vertical">
    <View/>
    <View android:layout_weight="1"/>
    <View/>
    <View android:id="@+id/bottom"/>
</LinearLayout>

每个子视图的高度在哪里,"wrap_content"其他的都在哪里"fill_parent"


3
您必须添加宽度和高度:<查看android:layout_weight =“ 1” android:layout_height =“ wrap_content” android:layout_width =“ wrap_content” />
uvgroovy 2011年

1
这比公认的答案更有效,因为它只有一个ViewGroup。
Dheeraj Vepakomma 2012年

2
这真太了不起了。我总是忘了这个窍门,最终花了很多时间弄乱我的布局。这真是太神奇了。解决世界饥饿。
埃里克·科克伦

1
这应该是正确的答案!不仅因为仅使用了一个LinearLayout,而且当您使用所需的布局设计向DialogFragment扩展时(某些视图应位于底部),这可以派上用场,因为出于某种原因我收到了android.view.InflateException:二进制XML文件行# 7:...使用RelativeLayout时,使用LinearLayout时一切正常。
Draško

1
@Androider应该是公认的答案,上面的只是解决方法。即使对于列表视图项目,它也可以正常工作。
Farhan

58

我认为这将是完美的解决方案:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- Other views -->
    <Space
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <!-- Target view below -->
    <View
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

</LinearLayout>

这是一个很好的解决方案,但仅适用于14级以上的API。
renatojf 2014年

@renatojf您也可以尝试使用空视图或布局而不是空间
Sviatoslav Zaitsev 2015年

谢谢!这正是我所需要的,不需要我做任何布局嵌套。我认为您有更好的答案。
Michael Alan Huff

2
你是天才!我为此浪费了2天,但在那里错过了一些东西(不使用相对和组件是我的版面,所以它会造成问题)-我想给出一个以上的观点,但是不能
令人兴奋的gosavi

11

您应该将参数gravity放到底部而不是在文本视图中,而不是在线性布局中。像这样:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="bottom|end">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Something"/>
</LinearLayout>

10

步骤1:在线性布局内创建两个视图

第2步:第一个视图必须设置为android:layout_weight =“ 1”

步骤3:第二个视图将自动向下推

<LinearLayout
android:id="@+id/botton_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

    <View
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

    <Button
    android:id="@+id/btn_health_advice"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>


</LinearLayout>

1

喜欢这个

 <LinearLayout
android:id="@+id/LinearLayouts02"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="bottom|end">

<TextView
    android:id="@+id/texts1"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_weight="2"
    android:text="@string/forgotpass"
    android:padding="7dp"
    android:gravity="bottom|center_horizontal"
    android:paddingLeft="10dp"
    android:layout_marginBottom="30dp"
    android:bottomLeftRadius="10dp"
    android:bottomRightRadius="50dp"
    android:fontFamily="sans-serif-condensed"
    android:textColor="@color/colorAccent"
    android:textStyle="bold"
    android:textSize="16sp"
    android:topLeftRadius="10dp"
    android:topRightRadius="10dp"
   />

</LinearLayout>

0

您也可以使用

android:layout_gravity="bottom"

为您的textview


-2

尝试这个

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

    <TextView
        android:id="@+id/textViewProfileName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.