安卓默认按钮样式无法生效

9

我将尝试设置我的样式,使所有的按钮都具有特定的颜色组合,具体而言是蓝底白字。这是我的主要样式文件styles.xml:

<resources>
    <style name="CustomTheme" parent="MaterialDrawerTheme.Light.DarkToolbar">
        <!-- various items -->

        <item name="android:buttonStyle">@style/ButtonStyle</item>
    </style>

    <!-- a couple of other styles -->

    <style name="ButtonStyle" parent="android:style/Widget.Button">
        <item name="android:textSize">19sp</item>
        <item name="android:textColor">@color/primaryTextContrast</item>
        <item name="android:background">@color/primary</item>
    </style>
</resources>

在清单文件中:

 <application
        android:name=".CustomApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/application_name"
        android:theme="@style/CustomTheme">

color/primary 是深蓝色,而 color/primaryTextContrast 则是白色。在 Lollipop 上,按钮看起来非常完美。但在 4.1 设备上,它是浅灰色带有黑色文本。我找到的所有资源都像我正在做的一样,所以我不知道自己错在哪里。

我在基础样式定义中控制文本大小时也遇到了类似的问题。

更新:这些是颜色。

<resources>
    <color name="primary">#3F51B5</color>
    <color name="dark">#303F9F</color>
    <color name="accent">#FFCA28</color>
    <color name="background">@android:color/white</color>
    <!-- Color for text displayed on top of the primary or dark color -->
    <color name="primaryTextContrast">@android:color/white</color>
    <!-- Color for text displayed on the background color (which I think will always be white) -->
    <color name="basicText">@color/primary</color>
    <!-- Color for text displayed on the accent color -->
    <color name="accentText">#303F9F</color>
</resources>

这是v19/styles.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="FullscreenTheme" parent="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus">
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowTranslucentStatus">true</item>
    </style>
</resources>

这是v21版本:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="CustomTheme">
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>
        <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
        <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
    </style>
</resources>

我不认为这两个因素是导致它在5.1上正常工作的原因。


你的代码在我的 Galaxy S3 Mini(Android 4.1)上完美工作,你确定你没有两个版本的 styles.xml,而且带有这段代码的版本是 > v16 吗? - Ruocco
我有两个版本,但这是主要的/res/values版本。 - nasch
@Jones,我添加了我的额外样式文件。 - nasch
3个回答

13

使用AppCompat 22.1.+22.2.0也可以),我像这样定义了一个样式:

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

接着使用来自android命名空间的原生theme属性,如Chris Banes在这篇精彩文章中所说,将主题应用于一个按钮。

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/sign_up_button"
    android:theme="@style/MyApp.Button.Red" />

android:textColor 在主题中已经定义,为什么在按钮声明中又要重新定义。 - Murtaza Khursheed Hussain
2
有没有一种方法可以更改应用程序中所有按钮的样式,以便我不必在每个按钮上设置任何内容?我认为这些样式文件应该能够做到这一点。 - nasch
由于某些未知原因,在主题中设置背景颜色时无法正常工作。可能是因为将其定义为应用程序主题会将其提供为“样式”属性,而不是“主题”。我希望尽快解决这个问题。 - Rafael Toledo
1
虽然对我来说这不是一个可行的选择,因为它需要我浏览整个已有的应用程序并更改每个“Button”,但直到现在这是我找到的唯一有效的解决方案。我真诚地希望Google能尽快修复这个错误。 - Joao Sousa
1
找到了解决方案,只需添加buttonStyle而不需要android:前缀,示例代码在我的答案中。 - fhucho
显示剩余2条评论

3
我尝试添加了buttonStyle,但没有使用前缀android:,问题得到了解决。是的,很奇怪。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="buttonStyle">@style/ButtonStyle</item>
    <item name="android:buttonStyle">@style/ButtonStyle</item>
</style>

我尝试了你的解决方案,但是没有成功。所有的样式都有效,除了按钮背景颜色。 - Rafael Toledo
我目前正在处理其他事情,但我会尝试这个,谢谢。 - nasch
你救了我的命!这段代码对我有效:
compileSdkVersion 27 <
minSdkVersion 22 <
targetSdkVersion 27 <
- Daniel Eberl

-2

Gradle:compile 'com.android.support:appcompat-v7:22.2.0'

为了让主题在Android Lollipop上正常工作,您需要扩展ActionBarActivity而不是Activity。通过进行此更改,您的主题设置应该可以正常工作。对于其他人来说,这是普遍适用的,对于较低版本的Android,您不应在item-name定义中使用android:标签。


我正在扩展AppCompatActivity...你能提供一些支持文档吗?因为如果不扩展ActionBarActivity,主题无法工作听起来真的很奇怪。 - nasch
我知道这很奇怪,但经过数小时的调试,我发现扩展ActionBarActivity对我有用。当我扩展Activity时,Theme.AppCompat没有显示Actionbar。所以我想这可能适合你的工作。 - gaurav
我不认为这是我的答案,因为ActionBarActivity已经被弃用并替换为AppCompatActivity,而我正在使用后者。谢谢。 - nasch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接