使用AppCompatTheme将Button置于相对布局中的奇怪行为

时间:2016-06-08 16:13:51

标签: android android-appcompat android-theme android-styles

查看代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp">

    <Button
        android:id="@+id/wi_fi_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="#feeca0"
        android:text="some text"
        android:textColor="#b5a24f" />

    <ProgressBar
        android:id="@+id/wifi_progressBar"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerInParent="true" />
</RelativeLayout>

此类元素放置,在将UI主题更新到AppCompat之前工作。更新后,所有按钮在所有情况下都会重叠元素,即使它们必须是高位(根据xml代码)

enter image description here

这是我的ActivityThem风格

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="android:textAppearanceButton">@style/AppTheme.ButtonsTextAppearance</item>
    <item name="switchStyle">@style/SwitcherStyle</item>
</style>

正如您所看到的,只有textAppearance覆盖。 Button(Base.Widget.AppCompat.Button)的父组件没有任何特殊属性(我希望在web ccs-z-index中找到类似的东西)。 我解决了这个问题:只需用框架布局包装按钮,然后我的行为返回(进度条在Buttons视图上绘制)。

那么,是否有人知道这是AppCompat中Button的错误或功能?

P.S:来自AS的截图​​,但设备上的行为也一样。

1 个答案:

答案 0 :(得分:0)

您对Z索引的怀疑是正确的。 Android 5引入了阴影和高程。 Button具有默认标高2dp,这使其可以在其他标高较小的窗口小部件(以相同布局)上方渲染,例如ProgressBar没有标高。

在运行Android 4及更低版本的设备上,海拔高度将被忽略。您的进度条将位于按钮上方。

最快和最肮脏的解决方法是将android:elevation="10dp"分配给进度条。它不会绘制任何阴影,因为它没有任何背景。但是它将比处于按下状态的按钮具有更高的高度。