android - 无法使用主题更改按钮背景
问题描述
我想在我的应用程序中为按钮设置自定义样式,但我尝试设置自定义主题,但它不起作用。例如,这不会改变背景
<Button
android:theme="@style/CustomTheme"
... />
<style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:background">@color/colorPrimary</item>
</style>
如果我使用样式做同样的事情,它工作正常
解决方案
发生的事情是 background 属性被Button
. 默认样式在您的主题中设置,如果您查看Theme.AppCompat.Light.DarkActionBar
(您要继承的主题),您将看到以下继承结构:
Theme.AppCompat.Light.DarkActionBar
Base.Theme.AppCompat.Light.DarkActionBar
Base.Theme.AppCompat.Light
Base.V7.Theme.AppCompat.Light
Base.V7.Theme.AppCompat.Light
您将在其中找到属性buttonStyle
定义,这是Button
元素的默认样式:
<item name="buttonStyle">@style/Widget.AppCompat.Button</item>
同样,如果您看一下,Widget.AppCompat.Button
您会发现它继承自Base.Widget.AppCompat.Button
并设置android:background
属性(在其他属性之间)。
所以,为了改变Button
主题的风格,你应该使用buttonStyle
属性。您最安全的选择是创建一个继承自的新样式Widget.AppCompat.Button
(因此您不会丢失在那里设置的所有其他属性)并在那里设置 android:background 属性:
<style name="CustomStyle" parent="Widget.AppCompat.Button">
<item name="android:background">@color/colorPrimary</item>
</style>
<style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="buttonStyle">@style/CustomStyle</item>
</style>
推荐阅读
- javascript - 将数组传递给烧瓶应用程序中的谷歌图表数据集
- javascript - D3.js version3 scale.ordinal() 没有按照我想要的方式读取我的数据
- python - Python中的文本组合生成器
- autodesk-forge - 您可以从 web.autocad.com 的 Web & Mobile 目录查询、翻译和打开 .dwg 文件吗?
- sql - 为什么在大 IN 条件下投射到地理更快?
- python - 在 for 循环中将完整数组附加到其他数组,类似于附加到列表(python)?
- python - 如何从 USB 端口看到持续的 8 位灰度图像数据流?
- search - zomato Api 不返回按聚合评级搜索的餐厅
- java - 如何修复 javacord 错误 java.security.InvalidAlgorithmParameterException
- c# - 在 Roslyn CSharpScript 中执行一个方法并传递参数,而不必将它们作为字符串或通过全局变量传递?