为什么 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"/>
原始解决方案来自:
我有以下布局(这里展示的是更简单的设计):
<?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"/>
原始解决方案来自: