android - 无法让 Material Design CheckBox 使用样式

标签 android checkbox material-design android-theme

我正在尝试将两个 CheckBox View 添加到我当前应用程序中的反馈 fragment ,该应用程序正在使用 AppCompat 库 (v7:22.2.1)。此应用程序的 API 范围是 16-current (22)。我的 list 设置了以下主题定义:

android:theme="@style/AppTheme"

在我的 styles.xml 文件中是这样定义的:

<resources>

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

    <style name="AppTheme.FacebookFlatButton">
        <item name="android:background">@drawable/facebook_flat_button</item>
        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

    <style name="AppTheme.TwitterFlatButton">
        <item name="android:background">@drawable/twitter_flat_button</item>
        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

</resources>

问题是我的 CheckBox(我也注意到我的 EditText) View 没有默认为正确的颜色,以便在选中时可以看到它们。这是 Android Studio 中的预览版和我的模拟器并排显示的屏幕截图:

Android Studio and Emulator

无论我将其他 SO 文章(如 this one)中的样式项组合到此样式中,颜色在模拟器或设备上不会改变,但它们会在预览中更新。我还尝试对父主题进行各种调整以适应我的自定义主题,但似乎没有什么关系。

我已经在 Nexus 5 (API 19) 和 Nexus 6 (API 22) 模拟器中尝试过这个,它在我的 Nexus 6 设备上也做同样的事情。

我并没有在这里定义太多自定义,但我仍然觉得我在这里遗漏了一些重要的小信息。我错过了什么?

最佳答案

好的,经过大量研究和测试,我有一个适用于我的 CheckBox 和 EditText 控件的解决方案。

我的(错误的)假设是一个主题可以处理 AppCompat 和 Material Design,这是不正确的。基本上,对于 AppCompat(< API 21),您必须使用 不带 android: 前缀的名称来定义您的样式,例如 CheckBox 和 EditText:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Base application theme -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- Customize your theme here. -->
    </style> 

    <style name="AppTheme.EditText" parent="Widget.AppCompat.EditText">
        <item name="colorControlNormal">@color/almanac_red_dark</item>
        <item name="colorControlActivated">@color/almanac_red_light</item>
        <item name="colorControlHighlight">@color/almanac_red_light</item>
    </style>

    <style name="AppTheme.CheckBox">
        <item name="colorAccent">@color/almanac_red_dark</item>
    </style>

    <style name="AppTheme.FlatButton">
        <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

    <style name="AppTheme.FacebookFlatButton" parent="AppTheme.FlatButton">
        <item name="android:background">@drawable/facebook_flat_button</item>
    </style>

    <style name="AppTheme.TwitterFlatButton" parent="AppTheme.FlatButton">
        <item name="android:background">@drawable/twitter_flat_button</item>
    </style>

</resources>

但是您必须在 values-v21 目录(带有 Material Design 父主题)中有另一个版本的 Material Design 版本(> API 21)样式, android: 前缀:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="@android:style/Theme.Material.Light">
        <!-- Customize your theme here. -->
    </style>

    <style name="AppTheme.EditText">
        <item name="android:colorControlNormal">@color/almanac_red_dark</item>
        <item name="android:colorControlActivated">@color/almanac_red_light</item>
        <item name="android:colorControlHighlight">@color/almanac_red_light</item>
    </style>

    <style name="AppTheme.CheckBox">
        <item name="android:colorAccent">@color/almanac_red_dark</item>
    </style>

</resources>

我已经尝试了 Nexus 4 (API 16)、Nexus 5 (API 19) 和 Nexus 6 (API 22) 模拟器以及我的物理 Nexus 6 设备,一切看起来都符合我的预期。

关于android - 无法让 Material Design CheckBox 使用样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31940637/

相关文章:

android - 如何检测 Android 上的语言是否为英语(所有变体)?

java - 如何迭代动态创建的对象?

java - % 在 url http 请求 java 中

javascript - 输入时触发 "change"事件不起作用

javascript - 如何保存动态创建的复选框的更改状态

android - 下图中 'Extended app bar'和 'tabs'的总高度是多少?

android - 如何使 AppBarLayout 在 windowTranslucentStatus 设置为 true 时完全消失

java - MaterialContainerTransform 过渡不适用于返回

java - 方法未执行 log.d 语句

android - 如何将填充(或边距)设置为 android.support.v4.widget.DrawerLayout,但是