android 5.0 及更高版本上的 FrameLayout 子顺序不正确

Incorrect FrameLayout's childs order on android 5.0 and above

这是我的 XML 布局代码:

<FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" >

        <Button
            android:id="@+id/btn_test"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:background="@android:color/black"
            android:minHeight="0dp"
            android:minWidth="0dp" />

        <TextView
            android:id="@+id/tv_test"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:background="@android:color/white"
            android:gravity="center"
            android:text="12"
            android:textColor="@android:color/black"
            android:textStyle="bold" />
    </FrameLayout>

如我所料,TextView 将覆盖 Button,但它仅适用于 android < 5.0。我从开发者网站研究了关于 FrameLayout 的所有 API 变化,但仍然没有得到准确的信息。有人找到了吗?如何通过 XML 在 Button 上叠加 TextView

我找不到您问题的正确答案,但对于当前的开发,我可以建议的是您需要的布局。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button
            android:id="@+id/btn_test"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:background="@android:color/black"
            android:minHeight="0dp"
            android:minWidth="0dp" />
    </LinearLayout>
    <TextView
        android:id="@+id/tv_test"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="12"
        android:textColor="@android:color/black"
        android:textStyle="bold" />
</FrameLayout>

终于知道变化了。那就是 evelation 。希望这对其他人有帮助。 http://developer.android.com/training/material/shadows-clipping.html

这是对@John 回答的补充。你可以这样做:

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" >

    <Button
        android:id="@+id/btn_test"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@android:color/black"
        android:minHeight="0dp"
        android:minWidth="0dp" />

    <TextView
        android:id="@+id/tv_test"
        ...
        android:elevation="20dp"
        ... />
</FrameLayout>

然后在代码中:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        finfViewById(R.id.tv_test).setOutlineProvider(null);
}

stateListAnimator="@null" 添加到您的按钮 XML:

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" >

    <Button
        android:id="@+id/btn_test"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="@android:color/black"
        android:minHeight="0dp"
        android:minWidth="0dp"
        android:stateListAnimator="@null" />

        ...

</FrameLayout>

这将使 Button 尊重其 Z 索引并将其定位在 TextView 之下。

Source