Widget.AppCompat.Button colorButtonNormal显示为灰色


68

我有values:styles.xml

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
    <item name="colorButtonNormal">@color/my_color</item>
    <item name="android:textColor">@android:color/white</item>
</style>

values-v21:styles.xml带有:

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
      <item name="android:colorButtonNormal">@color/my_color</item>
      <item name="android:textColor">@android:color/white</item>
</style>

和应用风格

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
      <item name="android:buttonStyle">@style/AppTheme.Button</item>
</style>

但是颜色显示为灰色而不是 @color/my_color


20
您应该接受答案,以便其他人知道哪种解决方案有效。
2015年

@Ben您说得对
severin.julien

2
没有答案……
Daniel Gomez Rico

我相信我已经尝试了以下所有答案(在Android Studio 3.4设计器中,API 28),但未成功:使用/不使用Android前缀;风格/主题;按钮主题和全局主题(应用于按钮)。所有情况都产生未样式化的灰色或样式化的配音(绝不是我选择的颜色)。
查尔斯·艾伦

Answers:


59

要自定义一个按钮,只需将android:theme =“ @ style / AppTheme.Button”设置为您的按钮。

<Button
    android:theme="@style/AppTheme.Button"
    />

定义自己的风格,就像在问题中一样

<style name="AppTheme.Button" parent="Base.Widget.AppCompat.Button">
    <item name="colorButtonNormal">@color/my_color</item>
</style>

[编辑]

在此处查看GitHub演示


是的,但是我想设置按钮的颜色
Daniel Gomez Rico

1
@danielgomezrico我创建了演示并将其发布在GitHub上。见我的更新来回答
阿列克

6
我正在做style = ..而不是android:theme = ...谢谢!
丹尼尔·威尔逊,

1
@PrashanthDebbadwar,尝试删除xml中的android:onClick属性。如果此参数确实有问题,请使用setOnClickListener(...)在代码中定义单击侦听器。但是这个问题听起来真的很奇怪。如果有时间,我也会尝试进行检查。
Oleksandr

1
为什么它适用于android:theme,而不适用于android:style?主题不是在childeren上使用样式的吗?
DennisVA '18

49

使用Widget.AppCompat.Button.Colored作为你的风格父母。

<style name="RedButton" parent="Widget.AppCompat.Button.Colored">
    <item name="android:textColor">@color/white</item>
    <item name="colorButtonNormal">@color/red</item>
</style>

使用android:theme,而不是style在按钮定义中使用:

<Button android:theme="@style/RedButton"/>

请参阅AppCompat v21>主题Android支持库v22.1-AppCompat博客文章。(请注意第二篇文章,android:themeAPI11-支持它,它只是不从父类自动继承,您必须在每个孩子上指定它,这不是问题,但值得一提-参见Chris Banes的文章)。


1
为什么Widget.AppCompat.Button.Colored
Daniel Gomez Rico

11
android:theme的@valentin +1
Rinav '16

1
如果仍然无法解决问题,尤其是在android 5或更高版本中使用支持dialogfragment时,请尝试在android之前为colorButtonNormal前缀。那是:android:colorButtonNormal
user3533716

14

将xml行放在“ AppTheme” xml中,而不是尝试从“ AppTheme.Button”进行设置。这在非棒棒糖设备的v22.1.1上对我有效。我猜这是一个错误,因为您的上述解决方案适用于棒棒糖。

<item name="colorButtonNormal">@color/my_color</item>

14

确保您Activity正在扩展AppCompatActivity,否则它将无法正确处理appCompat样式。

  • 类: android.support.v7.app.AppCompatActivity
  • 摇篮: compile 'com.android.support:appcompat-v7:23.0.1'

13

采用:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="buttonStyle">@style/AppTheme.Button</item>
</style>

除掉 android:


9

这样可行:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <!-- android:buttonStyle for v21+ and buttonStyle for the rest -->
    <item name="buttonStyle">@style/MyCustomButton</item>
    <item name="android:buttonStyle">@style/MyCustomButton</item>
    <item name="colorButtonNormal">@color/my_color</item>
</style>

<style name="MyCustomButton" parent="Base.Widget.AppCompat.Button">
    <item name="android:textColor">#ffffff</item>
    <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
</style>

colorButtonNormal可以设置为主题样式。要更改按钮的文本颜色,大小或任何其他功能,您可以创建样式,然后在主题样式中使用buttonStyle(小于v21)或android:buttonStyle(v21 +)设置按钮样式。


3

v21 / styles.xml

    <style name="AppTheme.BlueButton" parent="Widget.AppCompat.Button.Colored">
        <item name="android:colorButtonNormal">@color/blue</item>
        <item name="android:textColor">@color/text_white</item>
    </style>

styles.xml

<style name="AppTheme.BlueButton" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/blue_tint</item>
    <item name="android:textColor">@color/text_white</item>
</style>

最初我也面临这个问题。像上面那样进行校正后,我得到了正确的UI按钮


并且您android:buttonStyle也设置了样式或如何将样式设置为按钮?
丹尼尔·戈麦斯·里科

2
我用了-> android:theme =“ @ style / AppTheme.BlueButton'”
JEGADEESAN S

但问题是关于使用android:buttonStyle但感谢
Daniel Gomez Rico

2

这似乎是在Android的框架,我们不能自定义更改错误colorButtonNormalWidget.AppCompat.Button主题。
一种变通方法是定义另一个自定义AppCompat主题并用于colorAccentset colorButtonNormal

有以下两个步骤。
1.为您的自定义按钮定义另一个主题。

<resources>

  <!-- Base application theme. -->
  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
  </style>

  <!-- Custom button theme. -->
  <style name="CustomButtonTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Set your desired button color here. -->
    <item name="colorAccent">@color/red</item>
    <item name="buttonStyle">@style/Widget.AppCompat.Button.Colored</item>
  </style>
</resources>

2.在布局中应用按钮主题。

<Button android:theme="@style/CustomButtonTheme"/>

1

如果您想知道为什么colorButtonNormal未按禁用按钮的定义进行拾取,则可能还需要在主题中将其设置android:disabledAlpha1.0,否则默认情况下,您的颜色将融合到按钮的背景中。例:

<style name="MyButtonTheme" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:disabledAlpha">1.0</item>
    <item name="colorButtonNormal">@color/my_solid_disabled_color</item>
    <item name="colorAccent">@color/my_solid_accent_color</item>
    <item name="buttonStyle">@style/my_button_style</item>
</style>

1

尝试使用buttonStyle而不是android:buttonStyle,因为这是Lollipop之前的AppCompat属性,因此应该没有android前缀


0

嗨,我认为您使用的父窗口小部件可能不是正确的,android:Widget.Button对于API版本21或更早的版本,它应该正确,对于版本21或更高版本,您应该使用`android:Widget.Material.Button。假设您有默认样式,请参见下文。

res/values/styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:buttonStyle">@style/AppTheme.Button</item>
    </style>

    <style name="AppTheme.Button" parent="android:Widget.Button">
        <item name="android:background">@color/my_color</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

</resources>

对于API版本21,资源样式文件应类似于(res / values-v21 / style.xml)

<resources>

    <style name="AppTheme.Button" parent="android:Widget.Material.Button">
        <item name="android:background">@color/my_color</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

</resources>

谢谢如有任何问题,请与我联系。


但这Base.Widget.AppCompat.Button不是为我做的(“材料/兼容性”检查)吗?
Daniel Gomez Rico 2015年

只需使用按钮小部件。如果您使用AppCompat主题,它将自动在棒棒糖之前运行。至少那是官方文件所说的。
Sharj 2015年

您可以为其发布链接吗?
Daniel Gomez Rico
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.