应用材质主题时按钮的渲染顺序错误

时间:2015-01-23 08:10:44

标签: android android-layout android-theme

无论布局结构如何,Button小部件都会绘制在任何其他小部件之上。当应用Material Dark / Light主题时,它在RelativeLayout和FrameLayout中重复。查看下面的屏幕截图,以更好地说明这种奇怪的行为。

检查Nexus 4和Nexus 5.但我怀疑它与设备有关。

How it looks in Android Studio

How it looks on my Nexus 4

2 个答案:

答案 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 RelativeLayoutavailable 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 FrameLayoutavailable parameters for the layout_gravity

答案 1 :(得分:0)

从Lollipop(API 21)起,Android默认将提升/ Z动画应用于按钮。要避免这种情况,请将以下内容添加到Button XML中:

<Button
    ...
    android:stateListAnimator="@null"
/>

这将使按钮尊重其Z-index。

Source