为什么 FrameLayout 没有在我的布局中正确设置 Z 顺序?

Why FrameLayout isn't setting Z order correctly in my layout?

我有以下布局(这里展示的是更简单的设计):

<?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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main">
    <FrameLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hey, badge!"
            android:layout_margin="10dp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="AAAAA"
            android:layout_margin="10dp"
            android:textSize="12sp"
            android:background="#ff00ff"
            android:padding="10dp"
            android:layout_gravity="top|end"
            />
    </FrameLayout>
</RelativeLayout>

我希望设置带有文本 "AAAA" 的 TextView 作为 Button 的标志,即放置在右上角的按钮上方,但事实并非如此。

相反,当我在带有 Lollipop 的 HTC One M7 或带有 Lollipop 的 Genymotion Nexus 6 上尝试此代码时,屏幕看起来像这样:

当我使用 KitKat 在 Genymotion Nexus 5 上尝试相同的代码时,一切看起来都符合预期,即 第一个视图(按钮)显示在徽章(文本视图)下方

有人知道这里可能出了什么问题吗?

谢谢, 德韦蒂

elevation 导致此问题。它是在 Lollipop 中引入的,也负责 z 排序。将您的布​​局复制到 layout-v21 并为按钮设置 android:elevation="0dp"

我在某个地方的另一个线程上看到了这个,但你可以把它放到你的元素中:

android:stateListAnimator="@null"

正如其他人所说,lolipop 及以上的按钮高度已更改,因此它覆盖了其他元素。

例如在我下面的按钮视图中我使用它并且它显示:

<FrameLayout
    android:id="@+id/ib_one_container"

    android:layout_width="38dp"
    android:layout_height="38dp"
    android:layout_marginLeft="5.3dp"
    android:orientation="vertical"
    android:padding="3dp"
    >


    <Button
        android:id="@+id/ib"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:clickable="true"
        android:gravity="center"
        android:stateListAnimator="@null"
        android:textSize="11sp" />


    <com.mobile.pomelo.UI.customViews.CustomDiagonalLineView
        android:id="@+id/diagaonal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"

        />


</FrameLayout>

我在使用 FrameLayout 作为进度指示器覆盖时遇到了类似的问题(当我的屏幕忙于加载时)。

我不想将 XML 添加到我的应用程序中的每个其他元素,所以我只是向我的 FrameLayout 叠加层添加了一个高度。请注意 clickable 属性,它确保点击事件不会传递到下面的按钮。

进度指示器叠加层:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/progress_overlay"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:alpha="0.4"
    android:background="@android:color/black"
    android:animateLayoutChanges="true"
    android:elevation="10dp"
    android:clickable="true"
    android:visibility="gone">

    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:indeterminate="true"/>

</FrameLayout>

在我的其他观点中包含进度指示器:

<include layout="@layout/progress_overlay"/>

原始解决方案来自: