【问题标题】:Button is behind the ListView in FrameLayout按钮在 FrameLayout 中的 ListView 后面
【发布时间】:2015-02-13 21:49:09
【问题描述】:

我有一个由列表视图和按钮组成的 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>

【问题讨论】:

    标签: android xml listview android-framelayout


    【解决方案1】:

    来自 developer.android:

    FrameLayout 的设计目的是在屏幕上屏蔽一个区域以显示 单个项目。一般情况下,应该使用 FrameLayout 来容纳单个 子视图,

    framelayout 的当前尺寸是整个屏幕。如果我要为上述布局使用整个屏幕,我会执行以下操作:

    <?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。因此,您的按钮位于列表视图不会阻挡的受保护空间中。

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

    【讨论】:

    • 谢谢!但是,我尝试了您的解决方案,但该按钮仍在列表视图后面。
    • 这对我阅读上面的 xml 没有意义。您是否正在修改代码中的布局或按钮?如果没有,这里有一些事情可以尝试: 回到一个更简单的布局。然后添加回来并找出破坏它的原因。去掉一堆按钮的设置,比如layout_gravity,gravity。这只是消除了它们作为问题的可能来源。对于外部布局,更改背景颜色,以便您可以看到它们的边界或添加边框。然后你可以看到你的实际布局是什么。
    • 谢谢。我试图删除一些东西,我发现列表视图上的elevation 导致了问题。但是,我仍然希望列表视图投射阴影。我怎么能在没有海拔的情况下做到这一点?
    • Google : android listview shadow effect 你会得到一堆不同方法的链接。找一个你喜欢的。
    【解决方案2】:

    您可以为此使用RelativeLayout。如果您想通过 listview 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>
    

    【讨论】:

      【解决方案3】:

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

      似乎海拔导致该元素位于其他元素之上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2013-02-08
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多