Android Studio中按钮自定义状态色被主题覆盖不生效如何解决
问题原因
你使用的是Theme.MaterialComponents系列主题,该主题默认会将布局中声明的<Button>控件自动替换为MaterialButton实例,系统会优先应用主题内置的backgroundTint着色规则,覆盖你手动设置的background背景资源,导致自定义状态选择器无法生效。
解决方案
你可以任选以下一种方法解决:
方案1(最便捷,适配现有代码):给按钮添加禁用背景着色的属性
在你的Button标签中新增app:backgroundTint="@null",直接关闭MaterialButton的默认背景着色逻辑,你设置的自定义shape状态选择器就会正常生效。
修改后的按钮代码示例:<Button android:id="@+id/add_note" android:layout_width="0dp" android:layout_height="65dp" android:layout_weight="1" android:textSize="23sp" android:background="@drawable/button_states" app:backgroundTint="@null" android:text="@string/add_button" />你的布局根节点已经声明了
app命名空间,直接加属性即可无需额外配置。方案2:强制使用原生Button控件
将布局中的<Button标签替换为<android.widget.Button,跳过主题对MaterialButton的自动替换逻辑,原生Button不会被主题背景规则覆盖,自定义背景会直接生效。方案3(保留MaterialButton特性可选):使用tint状态选择器
如果你需要保留MaterialButton的圆角、水波纹等其他特性,可单独为app:backgroundTint设置颜色状态选择器,不过该方案仅适配纯色背景,你当前的需求带描边shape,更推荐使用方案1。
修改完成后重新编译运行,按钮的按下/松开状态颜色就会按照你定义的selector正常切换了。
内容的提问来源于stack exchange,提问作者Psoriaz
相关产品推荐
相关产品推荐

