Button 在 FrameLayout 中的 ListView 后面

Button is behind the ListView in FrameLayout

我有一个由列表视图和按钮组成的 FrameLayout。 FrameLayout 的全部要点是位于其他元素之后的元素将显示在它们之上。

由于按钮代码在 ListView 代码下方,我希望按钮始终位于顶部,但事实并非如此。我无法弄清楚 - 一旦我的列表中有足够的项目,按钮就在它下面并且它变得过时了。

XML:

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/lvMovies"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:background="#fff"
        android:elevation="3dp"
        android:paddingTop="8dp" />

    <Button
        android:id="@+id/btnAddMovie"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="bottom|end"
        android:layout_marginBottom="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:background="@drawable/raised_action_button"
        android:elevation="5dp"
        android:fontFamily="sans-serif-light"
        android:gravity="center"
        android:text="+"
        android:textColor="#ffffff"
        android:textSize="30sp" />
</FrameLayout>

来自developer.android:

FrameLayout is designed to block out an area on the screen to display a single item. Generally, FrameLayout should be used to hold a single child view,

框架布局的当前尺寸是整个屏幕。如果我要将整个屏幕用于上述布局,我会执行如下操作:

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

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="5"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/lvMovies"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:background="#fff"
        android:elevation="3dp"
        android:paddingTop="8dp" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:orientation="horizontal">    

<Button
        android:id="@+id/btnAddMovie"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="bottom|end"
        android:layout_marginBottom="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:background="@drawable/raised_action_button"
        android:elevation="5dp"
        android:fontFamily="sans-serif-light"
        android:gravity="center"
        android:text="+"
        android:textColor="#ffffff"
        android:textSize="30sp" />
    </LinearLayout>
</LinearLayout>

您可以为高度或宽度设置 0dp 权重,但不能同时设置两者。然后,您将它与 layout_weight 组合在一起。在这种情况下,第一个嵌套线性布局占据屏幕的 5/6,第二个占 1/6。因此,您的按钮位于受保护的 space 中,列表视图不会阻止它。

外部线性布局是垂直方向,这使得两个内部布局相互堆叠,内部是水平布局,使它们横跨整个屏幕。您需要调整这些权重以使其适合您。

您可以为此使用 RelativeLayout。如果你想在列表视图上使用按钮视图 android:layout_above="@+id/btnAddMovie" 删除这一行。

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

<ListView
    android:id="@+id/lvMovies"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/btnAddMovie"
    android:layout_marginBottom="8dp"
    android:background="#fff"
    android:elevation="3dp"
    android:paddingTop="8dp" />

<Button
    android:id="@+id/btnAddMovie"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_alignParentBottom="true"
    android:layout_gravity="bottom|end"
    android:layout_marginBottom="16dp"
    android:layout_marginEnd="16dp"
    android:layout_marginRight="16dp"
    android:elevation="5dp"
    android:fontFamily="sans-serif-light"
    android:gravity="center"
    android:text="+"
    android:textColor="#ffffff"
    android:textSize="30sp" />
</RelativeLayout>

从列表视图中删除 elevation 属性。而已。

似乎是高度导致该元素位于其他元素之上。