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
之下。
这是我的 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
之下。