最近写项目时遇到一个很奇怪的问题,在Relativelayout中Button始终在最顶层,无法被其他控件覆盖,然后试了下在Android 5.0以下的版本可以被正常覆盖,几经周折,终于找到了原因。

产生原因:stateListAnimator属性
谷歌在Material Design中推出,是一个非常简单的方法用来实现在可视状态之间平滑过渡。这个属性可以通过android:stateListAnimator进行设置,可以使控件在点击时产生不同的交互。对于Button,点击时默认有个阴影的效果用于表示按下的状态(5.0以前就是简单的变色)。
参考链接:android5.0 StateListAnimator

解决方法:

  1. 如果Button已经有自定义的selector样式而不需要原生的按下后的阴影效果,可以使用android:stateListAnimator=”@null”去掉阴影效果而使Button可以被正常的覆盖
  2. 如果希望保留Button的阴影效果而又想使其能够被覆盖,则应该使用个单独的Linearlayout对Button进行包裹,记住要给Button的下方和左右侧留出空余。这种方法虽然不符合规范,但是为了需求只得这么做了。

    代码示例:

  3.    <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="52dp">
    
                    <Button         
                    android:id="@+id/btn"
                    android:layout_width="match_parent"
                    android:layout_height="42dp"
                    android:layout_marginLeft="30dp"
                    android:layout_marginRight="30dp"
              android:background="@drawable/login_btn_selector"
                    android:text="@string/app_login"
                    tools:ignore="UselessParent"
                    android:textColor="@color/white"
                    android:textSize="20sp" />
            </LinearLayout>
    

results matching ""

    No results matching ""