【问题标题】:Android appcompat-v7:21.0.0 change material checkbox colorsAndroid appcompat-v7:21.0.0 更改材质复选框颜色
【发布时间】:2015-01-06 17:10:08
【问题描述】:

我已更新我的项目以使用最新的 appcompat 支持库,新版本使用材料设计复选框和单选按钮。我的应用程序是深色主题,复选框是黑色的,很难看到。我正在尝试根据Maintaining Compatibility 更改它们的颜色,但到目前为止没有任何效果。

res/values/styles.xml

  <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">

    <!-- customize the color palette -->
    <item name="colorAccent">@color/silver</item>
  </style>

在 build.gradle 中:

    android {
      compileSdkVersion 21
      buildToolsVersion '21.1.1'

      defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
      }
    }

.....
.....    

    compile 'com.android.support:appcompat-v7:21.0.0'

AndroidManifest.xml:

  <application
      android:name="ee.mtakso.App"
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppBaseTheme">

复选框、editTexts、单选按钮等保持黑色。

编辑

我不知道这是否有很大不同,但我使用的单选按钮和复选框用于CheckedTextView,如下所示:

单个(单选按钮): android:checkMark="?android:attr/listChoiceIndicatorSingle"

多(复选框): android:checkMark="?android:attr/listChoiceIndicatorMultiple"

由于这些可以绘制黑色材料,我不认为问题出在他们身上。

【问题讨论】:

  • 您是否更改了其他 Values 文件夹中的样式,例如 values-v14?
  • 您检查的是哪个版本的 android?低于 API 级别 14?或以上?
  • @Arash 不,我已经删除了 values-v14 等,所以这个 styles.xml 是唯一的。
  • @HarshaVardhan 以上,在 4.4.2 上测试
  • 我认为这是 appcompat-lib 中的错误。我在 22.1.0 版本中遇到了同样的问题。更新到 22.1.1 后,小部件着色再次起作用。

标签: android material-design


【解决方案1】:

未选中的 CheckBoxes 和 RadioButtons 也有类似的问题。 我找到了解决方案,当我发现控件从

中获取“关闭”颜色时

&lt;item name="android:textColorSecondary"&gt;@color/secondary_text&lt;/item&gt;


编辑:

指定,如果您的应用或活动的主题继承了 L 的 AppCompat (Dark/Light/Light.DarkActionBar) 之一,您可以设置:

<style name="SampleTheme" parent="Theme.AppCompat">
    <item name="colorAccent">@color/green</item>
    <item name="android:textColorSecondary">@color/red</item>
</style>

这就是结果:

注意:当您获得不同的效果时,您可能使用了“错误”主题 - 请确保您设置正确。

【讨论】:

  • 这在 Android 4.4.4 上不起作用。 CheckBoxes 和 RadioButtons 保持黑色。
  • 我确定在 KitKat(确切地说是 4.4.4,设备)上它可以工作。 4.3、4.4.2 和 5.0.1 看起来也不错。我已经编辑了我的答案 - 检查我的通知,也许这会对你有所帮助。
  • 所以我的问题是,我希望CheckBoxesRadioButtons 都在文本的右侧。所以我尝试使用属性android:button="@null"android:drawableRight="?android:attr/listChoiceIndicatorMultiple" 作为CheckBox,并使用属性android:button="@null"android:drawableRight="?android:attr/listChoiceIndicatorSingle" 作为RadioButton。但是android:button="@null" 似乎在 Pre-Lollipop 设备上的这些小部件的 AppCompat 主题中进行剥离和小部件着色。
  • 我明白了。他们确实是黑人。我认为AppCompatandroid:drawableRight 识别为普通选择器 而不是button-to-tint。 (如果您删除android:button="@null",您可以看到原始标记已正确着色,但右侧仍为黑色)。无论如何,最简单的解决方法是创建由 TextView 和 CheckBox/RadioButton 组成的自定义组合,不带文本。
  • android:textColorSecondary 是否用于设置复选框和单选按钮旁边的任何其他小部件的样式?
【解决方案2】:

我认为这是 AppCompat 主题中的错误。我的解决方法是在 xml 布局文件中的每个 CheckBox 中添加两行代码。

android:button="@drawable/abc_btn_check_material"
android:buttonTint="@color/colorAccent"

你从来没有真正想直接引用 abc_drawables 但在这种情况下我没有找到其他解决方案。

这也适用于 RadioButton 小部件!你会用 abc_btn_radio_material 而不是 abc_btn_check_material

【讨论】:

  • 太棒了!使用 Tint 并将其设置为适当的主色主题 UI :-)
  • 这不会改变涟漪效果的颜色。
  • @Waza_Be 我将不得不再次测试...可能是特定于 sdk 的。
  • @Waza_Be,如果你想改变涟漪效果颜色,把这个项目放在你的主应用主题中:&lt;item name="colorControlHighlight"&gt;@color/yourRippleColor&lt;/item&gt;
【解决方案3】:

我这样做是为了至少更改复选框的边框:

<style name="checkBoxComponent" parent="AppTheme">
    //Checked color
    <item name="colorAccent">@color/blueBackground</item> 
    //Checkbox border color
    <item name="android:textColorSecondary">@color/grayBorder</item> 
</style>

在我的布局中

<android.support.v7.widget.AppCompatCheckBox
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:theme="@style/checkBoxComponent"
                        android:text="Yay" />

仍在研究如何获取复选框的背景。 希望对您有所帮助。

【讨论】:

  • 这对我有用。但需要注意的是,AppCompatCheckBox 似乎不适用于 Android 5 和 6(它只是崩溃)。因此,您必须在这些 Android 版本上使用常规 CheckBox。
  • 更改单个组件主题而不是整个应用程序的所有组件(如已接受的答案)的绝佳解决方案。也适用于(我的)使用常规 CheckBox 和 android:button="@null"android:drawableRight="?android:attr/listChoiceIndicatorMultiple" 的情况,某些 cmets 也要求这样做!
【解决方案4】:

我和你有同样的问题。 我又看了一遍AppCompat v21 — Material Design for Pre-Lollipop Devices!

我发现这个“你的所有活动都必须扩展自 ActionBarActivity,它扩展自 v4 支持库中的 FragmentActivity,因此你可以继续使用片段。” .

所以我将我的活动更改为 ActionBarActivity,它解决了我的问题。我希望它也能解决你的问题。

【讨论】:

  • 我所有的活动已经从 ActionBarActivity 派生。我只升级了兼容库,发现在 5.0 上运行该应用程序一切正常,但后来意识到它在任何 4.x 设备上都没有按预期运行,复选框几乎不可见,当我切换到全黑背景,而不是默认的丑陋的灰色。
  • 另一个问题是,在为列表视图充气时,请确保充气器是从您的 ActionBarActivity 创建的,而不是从任何其他上下文(包括 getBaseContext() )创建的。因此,在创建适配器时,请记住将“this”作为上下文传递。
  • 这对我来说是正确的解决方法。请注意,appcompat 支持库中的“ActionBarActivity”似乎已被弃用,取而代之的是“AppCompatActivity”。
【解决方案5】:

我一直在寻找解决方案,我找到了。

第 1 步
扩展 ActionBarActivity

public static class MyActivity extends ActionBarActivity {
        //...
}

第 2 步
在您的样式文件中写入两个值

<style name="MyTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="colorAccent">#009688</item>
        <item name="android:textColorSecondary">#757575</item>
</style>

colorAccent - 检查颜色
android:textColorSecondary - 未检查颜色

第 3 步
在 AndroidManifest.xml 中设置您的主题

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.test.radiobutton"
          android:versionCode="1"
          android:versionName="1.0">
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">

                    ....

        <activity android:name=".activity.MyActivity "
                  android:theme="@style/MyTheme"/>

                  .....

    </application>
</manifest>



结果
Android 5

Android 4.2.2

【讨论】:

  • 这对我没有帮助。我必须将 app:buttonTint="?attr/colorAccent" 添加到每个 RadioButton/CheckBox。
【解决方案6】:

1.在您的 styles.xml 文件中声明自定义样式。

<style name="CustomStyledRadioButton" parent="Theme.AppCompat.Light">
    <item name="colorControlNormal">@color/red</item>
    <item name="colorControlActivated">@color/red_pressed</item>
</style>

2。通过 android:theme 属性将此样式应用于您的 RadioButton。

  <RadioButton  android:id="@+id/rb_option1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:checked="true"
    android:gravity="left"
    android:lineSpacingExtra="10dp"
    android:padding="10dp"
    android:text="Option1"
    android:textColor="@color/black"
    android:theme="@style/CustomStyledRadioButton"/>

【讨论】:

  • 您的父主题将很难看到,因为它以.Light 结尾。如果您删除父主题,它将适用于 AppCompat 的浅色和深色主题。
【解决方案7】:

100% 正常工作

只需为您的 RadioButton 创建一个样式并更改 colorAccent,如下所示:

<style name="RadioButtonTeal" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorAccent">@color/md_teal_600</item>
</style>

然后只需将此样式添加到您的 AppCompatRadioButton:

<android.support.v7.widget.AppCompatRadioButton
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:theme="@style/RadioButtonTeal" />

【讨论】:

  • 这似乎有效。但是您可能会发现 AppCompatRadioButton 在 Android 5 和 6 上会导致崩溃。因此您必须在这些 Android 版本上使用常规 RadioButton。
【解决方案8】:

要指定颜色,请覆盖:

检查颜色:

<item name="android:colorControlActivated">@color/your_color</item> 

对于未检查的颜色:

<item name="android:colorControlNormal">@color/your_color</item>

【讨论】:

    【解决方案9】:

    使用复选框和单选按钮的兼容性库会遇到很多问题。

    1) 它们仅适用于任何 Android 4.x 设备的黑色。它们在 Android 5.x 和 2.x 中运行良好(不要问我为什么它在 2.x 上工作,不知道)。

    2) 它们没有禁用状态(是否启用所有复选框都没关系,否则你会得到一个非常糟糕的惊喜)。

    注意默认的深色主题背景是灰色的,不是黑色的,所以如果你保持默认就“ok”。

    为了解决这个问题,我创建了以下可绘制对象的白色和禁用版本,全部添加到我的核心项目中,但没有在兼容项目中(出于明显的维护目的):

    abc_btn_check_to_on_mtrl_000
    abc_btn_check_to_on_mtrl_015
    abc_btn_radio_to_on_mtrl_000
    abc_btn_radio_to_on_mtrl_015
    

    然后创建一个drawable来管理所有状态(覆盖兼容原始状态):

    例如,深色主题会使用这个:

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_enabled="false" android:state_checked="true" android:drawable="@drawable/abc_btn_check_to_on_mtrl_015_disabled" />
        <item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/abc_btn_check_to_on_mtrl_015" />
        <item android:state_enabled="true" android:drawable="@drawable/abc_btn_check_to_on_mtrl_000" />
        <item android:drawable="@drawable/abc_btn_check_to_on_mtrl_000_disabled" />
    </selector>
    

    轻主题将使用这个(用户可以在我的应用程序中切换主题):

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_enabled="false" android:state_checked="true" android:drawable="@drawable/abc_btn_check_to_on_mtrl_015_disabled" />
        <item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/abc_btn_check_to_on_mtrl_015_light" />
        <item android:state_enabled="true" android:drawable="@drawable/abc_btn_check_to_on_mtrl_000_light" />
        <item android:drawable="@drawable/abc_btn_check_to_on_mtrl_000_disabled" />
    </selector>
    

    然后我要做的就是覆盖默认的兼容主题(活动和对话框,对于浅色/深色主题),添加如下内容:

        <item name="android:listChoiceIndicatorSingle">@drawable/abc_btn_radio_material</item>
        <item name="android:listChoiceIndicatorMultiple">@drawable/abc_btn_check_material</item>
    

    这适用于轻主题:

        <item name="android:listChoiceIndicatorSingle">@drawable/abc_btn_radio_material_light</item>
        <item name="android:listChoiceIndicatorMultiple">@drawable/abc_btn_check_material_light</item>
    

    现在,我在每个 Android 版本上都有完全可操作的复选框和收音机! IMO compat 库根本没有针对深色主题进行测试,只使用了白色主题。兼容库的开发人员也可能永远不会使用禁用状态。

    【讨论】:

    • 但这不适用于填充了 setMultiChoiceItems(...) 的 AlertDialogs (Android 4.x)!它们仍将是 Holo 风格的复选框... :(
    • 确实如此。要解决这个问题,您需要替换我在项目中完成的 ListView 'on-the-fly',但这是另一个问题,需要对 AlertDialog 类进行非常复杂的“hack”。
    • 设置色调颜色似乎已在 appcompat 22.1 中修复:developer.android.com/tools/support-library/index.html
    【解决方案10】:

    只需像这样扩展 ActionBarActivity

    Public class MainActivity extends ActionBarActivity {
    
    //...
    
    }
    

    【讨论】:

    • 如果您扩展任何标准视图,您必须扩展TintXX,即TintCheckBox。或者,如果您不想扩展 ActionBarActivity,您可以从中复制 onCreateView 方法。
    【解决方案11】:

    根据 android 博客文章,您所做的应该适用:

    colorAccent :对主要品牌色彩的明亮补充。默认情况下,这是应用于框架控件的颜色(通过 colorControlActivated)。

    colorControlActivated :应用于处于激活(例如选中)状态的框架控件的颜色。

    也许问题出在您的以 @style/Theme.AppCompat.Light 作为父主题的主题上,请尝试仅使用 Theme.AppCompat :

    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
        <!-- customize the color palette -->
        <item name="colorAccent">@color/silver</item>
    </style>
    

    【讨论】:

    • 抱歉忘了提,我已经试过Theme.AppCompat,没有任何区别。
    【解决方案12】:

    如果你想改变一个特定的复选框背景颜色(而不是整个应用程序),你可以试试这个技巧:

    在drawable文件夹中为背景创建custom_checkbox.xml文件:

     <shape xmlns:android="http://schemas.android.com/apk/res/android">
         <stroke android:width="14dp" android:color="@android:color/transparent"  />
         <solid android:color="#ffffff" /> //the intended color of the background
         <corners android:radius="2dp" />
     </shape> 
    

    然后将其设置为复选框的背景:

    <CheckBox
        android:id="@+id/rebate_tnc_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/custom_checkbox" />
    

    【讨论】:

      【解决方案13】:

      您可以将另一个主题传递给警报对话框的构造

      <style name="RadioButton" parent="Theme.AppCompat.Light.Dialog.Alert">
          <item name="colorControlNormal">@color/red</item>
          <item name="colorControlActivated">@color/green</item>
      </style>
      

      并在构造函数中使用该样式

      new AlertDialog.Builder(getContext(), R.style.RadioButton);
      

      【讨论】:

        【解决方案14】:

        您的 AppTheme 的父级是 @style/Theme.AppCompat.Light

        将其更改为@style/Theme.AppCompat

        现在您的控件将在深色背景上变亮。

        【讨论】:

          【解决方案15】:

          我正在使用 appcompat 库 v21:

          <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
                  <item name="colorPrimary">@color/custom_color</item>
                  <item name="colorAccent">@color/custom_color</item>    
          </style>
          

          上述样式使我的复选框以材料设计(在 android 5、4.3、4.1.1 上测试)出现,但在 android 2.3.3 上以旧复选框样式出现。

          【讨论】:

            【解决方案16】:

            如果您尝试手动创建 ComboBox (new ComboBox() ...),那么无论您设置什么,它们始终是黑色的。很明显,compat 库坏了,我为此创建了一个错误报告:https://code.google.com/p/android/issues/detail?id=158020

            【讨论】:

              【解决方案17】:

              添加此语法为小部件(如复选框或单选按钮)着色 android:buttonTint="@color/silver"

              【讨论】:

                【解决方案18】:

                添加

                <item name="android:textColorSecondary">@color/secondary_text</item>
                

                在 style.xml 和 style.xml(v21) 中

                【讨论】:

                  猜你喜欢
                  • 2019-09-26
                  • 2015-10-03
                  • 2022-01-12
                  • 2015-05-30
                  • 2021-12-26
                  • 2018-12-01
                  • 1970-01-01
                  • 2020-09-22
                  • 2014-12-31
                  相关资源
                  最近更新 更多