无论布局结构如何,Button小部件都会绘制在任何其他小部件之上。当应用Material Dark / Light主题时,它在RelativeLayout和FrameLayout中重复。查看下面的屏幕截图,以更好地说明这种奇怪的行为。
检查Nexus 4和Nexus 5.但我怀疑它与设备有关。
答案 0 :(得分:8)
Android 5.0 Lollipop和Material Design引入了新属性来指定小部件的高程(Z-index)。它被描述为here。
要在按钮上绘制视图,您可以将android:elevation="1dp"
添加到视图
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Don't look so deep"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C00"
android:elevation="1dp"
/>
以下是早期回答误解问题的一部分,以备将来参考
使用RelativeLayout,您必须指定元素相对于其他元素的位置。
所以说你想让按钮下面有View
,你必须在元素中添加id并指定视图在按钮下面:
<Button
android:id="+id/myactivity_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Don't look so deep"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C00"
android:layout_below="@id/myactivity_button"
/>
查看Android Developer Guide for RelativeLayout和available LayoutParameters for RelativeLayouts
FrameLayout
通常不适合组织多个组件。 FrameLayout旨在阻挡屏幕上的区域以显示单个项目。可以使用android:layout_gravity
属性控制FrameLayout子项的位置。
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:text="Don't look so deep"
/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C00"
android:layout_gravity="bottom"
/>
查看Android docs for FrameLayout和available parameters for the layout_gravity
答案 1 :(得分:0)
从Lollipop(API 21)起,Android默认将提升/ Z动画应用于按钮。要避免这种情况,请将以下内容添加到Button XML中:
<Button
...
android:stateListAnimator="@null"
/>
这将使按钮尊重其Z-index。