Android:如何在底部和上方的列表视图中对齐按钮?


76

我想在列表视图的底部有一个按钮。

如果我使用relativeLayout / FrameLayout,它会对齐,但listView会变得非常僵化。

(在底部的按钮后面)

在此处输入图片说明

框架布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/btnButton"
            android:text="Hello"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" />
    </FrameLayout>
</FrameLayout>

RelativeLayout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/btnButton"
            android:text="Hello"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" />
    </RelativeLayout>
</RelativeLayout>

以上两个代码只能像第一个图像一样工作。我想要的是第二张图片。

有人可以帮忙吗?

谢谢。

Answers:


181

一个FrameLayout宗旨是覆盖在彼此之上的东西。这不是您想要的。

在您的RelativeLayout示例中,将ListViews的高度和宽度设置MATCH_PARENT为此将使其与其父级占用相同的空间,从而占用页面上的所有空间(并覆盖按钮)。

尝试类似:

<LinearLayout 
   android:layout_width="match_parent" 
   android:layout_height="match_parent" 
   android:orientation="vertical">
  <ListView 
     android:layout_width="match_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1"/>
  <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0"/>
</LinearLayout>

layout_weight使用规定了额外的空间如何。本Button不想舒展超越它需要的空间,所以它有一个权重为0。ListView要采取了所有多余的空间,所以它具有权重为1。

您可以使用来完成类似的操作RelativeLayout,但是如果只是这两项,那么我认为aLinearLayout更简单。


5
解决了我的问题,但android:weight应该是:android:layout_weight
NFC家伙

@Mayra您的解决方案效果很好。但是,是否有理由仅适用android:orientation="vertical"于水平方向,而不适用于未指定水平方向?
埃里克

2
但是此解决方案无法处理列表视图不够长以填充屏幕的整个垂直空间的情况。如果列表视图仅占整个屏幕的一半,则该按钮将显示在列表视图的正下方,从而结束于屏幕中间的某个位置。在这种情况下,如何使按钮始终显示在底部?
2013年

1
android:layout_weight =“ 0dip”不正确,无论如何,它都应该是android:layout_weight =“ 0”
非法论点

2
这个答案比我在正式文档中遇到的任何内容都更好,这些内容似乎都向已经知道它的人解释了东西。
user1725145 2015年

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

    <ListView android:id="@+id/ListView01" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1">
    </ListView>

    <FrameLayout android:id="@+id/FrameLayout01" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content">
         <Button android:id="@+id/Button01" 
              android:layout_width="wrap_content" 
              android:layout_height="wrap_content" 
              android:text="button" 
              android:layout_gravity="center_horizontal">
        </Button>
    </FrameLayout>

  </LinearLayout>

这是您要寻找的设计。尝试一下。


4

我需要在底部并排放置两个按钮。我使用了水平线性布局,但是为按钮的线性布局分配android:layout_height="0dp"android:layout_weight="0"无效。android:layout_height="wrap_content"仅分配按钮的线性布局即可。这是我的工作布局:

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

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="0dp" 
        android:layout_weight="1" />

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:orientation="horizontal">

        <Button
            android:id="@+id/new_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="New" />

        <Button
            android:id="@+id/suggest_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Suggest" />

    </LinearLayout>

</LinearLayout>

2

RelativeLayout如果子级具有分别正确定义其and或and值的属性,则它将忽略其子级android:layout_widthandroid:layout_height属性。leftrighttopbottom

为了在右侧图像上显示结果,并在按钮上方显示列表,您的布局应如下所示:

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

    <android.support.v7.widget.RecyclerView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@android:id/button1"
        android:layout_alignParentTop="true"/>

    <Button
        android:id="@android:id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@android:string/ok"/>

</RelativeLayout>

关键是要在中定义android:layout_alignParentTop(定义top值)和android:layout_above(定义bottom值)RecyclerView。这样,RelativeLayout将忽略android:layout_height="match_parent",并将RecyclerView放置在上方Button

另外,android:layout_alignWithParentIfMissing如果布局更复杂,并且仍然需要定义这些值,请确保您调查了。


1

我正在使用Xamarin Android,我的要求与上面的William T. Mallard完全相同,即在ListView下有2个并排按钮。解决方案是此答案在Xamarin Studio中不起作用-当我将ListView的高度设置为“ 0dp”时,ListView便消失了。

我正在使用的Xamarin Android代码如下:

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

<ListView
    android:id="@+id/ListView1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:layout_above="@+id/ButtonsLinearLayout" />
<LinearLayout
    android:id="@id/ButtonsLinearLayout"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:orientation="horizontal"
    android:layout_alignParentBottom="true">
    <Button
        android:id="@+id/Button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
    <Button
        android:id="@+id/Button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1" />
</LinearLayout>
</RelativeLayout>

我将ButtonsLinearLayout对齐到屏幕底部,并将ListView设置为ButtonsLinearLayout上方。


0

@jclova您可以做的另一件事是layout-below=@+id/listviewid在相对布局中使用


0

在listview的相对布局高度中,match_parent该高度为fill_parent(适用于2.1和更早版本),所以最好的解决方案是,如果您要使用相对布局,则首先声明您的按钮,然后声明列表视图,将列表视图的位置设置为按钮id上方,如果希望按钮始终位于底部,然后使其对齐AlignParentBottom。

<RelativeLayout 
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:id="@+id/rl1"><Button 
 android:layout_width="MATCH_PARENT" 
 android:layout_height="WRAP_CONTENT" 
 /><ListView 
 android:layout_width="MATCH_PARENT" 
 android:layout_height="0" 
 android:layout_above="@id/listview"/></RelativeLayout>

这样可以防止列表视图占据整个位置并使按钮显示出来。


(警告:前面是次要的Android术语)。不推荐使用的术语是“ fill_parent”,而不是“ match_parent”。这对我来说很有意义,因为“填充”表示两个维度,而“匹配”表示“与...相同”。
William T. Mallard

0

这将是解决该问题的最佳和最简单的方法。只需添加 android:layout_above="@id/nameOfId"要相对于该布局移至上方的布局即可。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sumeru.commons.activity.CommonDocumentUploadActivity">

    <ListView

        android:id="@+id/documentList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/verifyOtp" />


    <com.sumeru.commons.helper.CustomButton
        android:id="@+id/verifyOtp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/otp_verification" />
</RelativeLayout>
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.