小工具没有在Lollipop上着色

时间:2015-01-14 09:23:17

标签: android android-widget android-5.0-lollipop android-appcompat

我正在为我的应用程序使用appcompat v21.0.3。我做了所有类似的事情:android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

但是在Lollipop(当然还有旧设备)上,一些小部件并没有用我的强调色调着色。例如:

  • SwitchCompat有色:switchcompat

  • ListPreference未着色enter image description here

  • ProgressDialog未着色enter image description here

这是我的代码:

的build.gradle

...
compile 'com.android.support:appcompat-v7:21.0.+'
...

的AndroidManifest.xml

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/CET"
        android:hardwareAccelerated="true"
        tools:replace="label">

的themes.xml

<resources>

    <style name="CET" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/accent</item>
    </style>

</resources>

colors.xml

<resources>

    <!-- App branding color -->
    <color name="primary">#a32b30</color>

    <!-- Darker variant for status bar and contextual app bars -->
    <color name="primary_dark">#000000</color>

    <!-- Theme UI constrols like checkboxes and text fields -->
    <color name="accent">#a32b30</color>

</resources>

有人有想法吗?

更新:截至2015年6月,仍然无效,但我最终使用https://github.com/afollestad/material-dialogs。对于对话框来说非常好用,包括ListPreferences。

6 个答案:

答案 0 :(得分:29)

按照以下指南

除非另有说明,否则以下所有着色均适用于使用AppCompat v21的棒棒糖和前棒棒糖。要使用这些属性的支持版本,请删除android命名空间。例如,&#34; android:colorControlNormal&#34;成为&#34; colorControlNormal&#34;。对于运行Lollipop的设备,这些属性将传播到android命名空间内的相应属性。通过包含&#34; android:&#34;将会注意到任何例外情况。前缀。

All Clickable Views:
-----------
* ripple effect (Lollipop only) -- "colorControlHighlight"

Status Bar:
------------
* background (Lollipop only) - "colorPrimaryDark"

Navigation Bar:
----------------
* background (Lollipop only) - "android:navigationBarColor"

EditText:
----------
* underline (unfocused) -- "colorControlNormal"
* underline overlay (focus) -- "colorAccent"
* cursor -- "colorAccent"
* text color -- "android:textColorPrimary"

CheckBox:
----------
* box unchecked -- "colorControlNormal"
* box checked -- "colorAccent"

RadioButton:
-------------
* unselected -- "colorControlNormal"
* selected -- "colorAccent"
* ripple effect (Lollipop only) -- "colorControlHighlight"

SwitchCompat:
-------------
* thumb switch off -- "colorSwitchThumbNormal"
* thumb switch on -- "colorAccent"
* track overlay (when switched on) -- "colorAccent"

Spinner:
---------
* indicator (not pressed) -- "colorControlNormal"
* indicator (pressed) -- "colorAccent"
* selected entry text color (Lollipop only) -- "android:textColorPrimary"

ActionBar:
-----------
* background -- "colorPrimary"
* title color -- "android:textColorPrimary"
* overflow icon -- "android:textColorPrimary"
* up button -- "android:textColorPrimary"
* action icons -- "android:textColorPrimary" †
* overflow menu background -- "android:colorBackground"
* overflow text color -- "android:textColorPrimary"

Toolbar (Theme Overlay should be used):
----------------------------------------
* background -- must be set manually in XML. Can do (android:background="?attr/colorPrimary")
* overflow icon -- "android:textColorPrimary"
* navigation icon -- "android:textColorPrimary" †
* action icons -- "android:textColorPrimary" †
* overflow menu background -- "android:colorBackground"
* overflow text color -- "android:textColorPrimary"

P.S。默认情况下,着色仅适用于列入白名单的股票行动图标(请参阅TintManager源代码)。例如,后退箭头图标"abc_ic_ab_back_mtrl_am_alpha"是有色的,但复制该确切文件并重命名它将导致图标在拍摄随机图像时没有着色并将其重命名为"abc_ic_ab_back_mtrl_am_alpha"将导致它有色。通过在drawable中创建<bitmap> xml文件并应用"android:tint"属性,可以在Lollipop中以XML格式完成着色。这个图标可用于Lollipop和pre-Lollipop,但它只会在Lollipop中着色。也可以使用ColorFilter以编程方式完成着色操作图标。

Source

答案 1 :(得分:12)

您通常应该使用自己的进度条而不是对话框,然后您可以制作适用于L和pre-L的着色版本,如下所示:

public class TintedProgressBar extends ProgressBar {
    public TintedProgressBar(Context context) {
        super(context);
        init();
    }

    public TintedProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TintedProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void init() {
        getIndeterminateDrawable().setColorFilter(getResources().getColor(R.color.primary), PorterDuff.Mode.SRC_IN);
        getProgressDrawable().setColorFilter(getResources().getColor(R.color.primary), PorterDuff.Mode.SRC_IN);
    }
}

如果您真的想要更改对话框中的颜色,可以在dialog.findViewById(android.R.id.progess)找到嵌套的进度条

答案 2 :(得分:5)

要改变Progress Dialog drawable的颜色,我使用了以下解决方法:我已经创建了AppCompat警告对话框基本样式

    <style name="CustomAppCompatAlertDialogStyle"    parent="Theme.AppCompat.Light.Dialog.Alert">
            <item name="colorAccent">@color/defaultColor</item>
            <item name="android:indeterminateTint">?attr/colorAccent</item>
            <item name="android:indeterminateTintMode">src_in</item>
    </style>

然后将这些主题应用于进度对话框:

mProgressDialog = new ProgressDialog(this, R.style.CustomAppCompatAlertDialogStyle);

答案 3 :(得分:3)

它只回答了部分问题,但是appcompat库中的进度条样式并没有在棒棒糖上获取强调色,即使在ProgressDialog之外也是如此。

您需要自己设置,例如使用此样式:

<style name="TintedProgressBar" parent="Widget.AppCompat.ProgressBar">
    <item name="android:indeterminate">true</item>
    <item name="android:indeterminateTint">?attr/colorAccent</item>
    <item name="android:indeterminateTintMode">src_in</item>
</style>

然后您可以申请ProgressBarContentLoadingProgressBar。 (请注意,进度条膨胀的父元素显然必须应用定义colorAccent属性的主题;否则使用直接颜色资源)

如果要在对话框中集成进度条,因为我不认为ProgressDialog支持自定义其进度条超出类型和可绘制范围,您可能需要设置AlertDialog带有应用上述主题的进度条,或者只是使用自定义对话框我猜您可以参考this answer将上述进度条相关属性应用于对话框。

答案 4 :(得分:1)

尝试属性colorControlActivated

的themes.xml

<style name="CET" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="colorControlActivated">#a32b30</item>
</style>

答案 5 :(得分:0)

据我所知,对话框中的任何内容都不会在Lollipop中自动着色(尚未)。 Checkout material-dialogs,一个自动为您执行此操作的库(但它仅支持API 14 +)。

结帐来自类似问题的答案:Android v21 Theme.Appcompat color accent is ignored, no padding on dialogs