Как _реально_ программно изменить основной и акцентный цвет в Android Lollipop?

Прежде всего, этот вопрос задает очень похожий вопрос. Однако в моем вопросе есть тонкая разница.

Я хотел бы знать, можно ли программно изменить атрибут colorPrimary темы на произвольный цвет?

Так, например, у нас есть:

<style name="AppTheme" parent="android:Theme.Material.Light">
    <item name="android:colorPrimary">#ff0000</item>
    <item name="android:colorAccent">#ff0000</item>
</style>

Во время выполнения пользователь решает использовать #ccffff в качестве основного цвета. Конечно, я не могу создавать темы для всех возможных цветов.

Я не возражаю, если мне придется делать хакерские штуки, например полагаться на частные внутренние компоненты Android, если они работают с использованием общедоступного SDK.

Моя цель - сделать так, чтобы ActionBar и все виджеты, такие как CheckBox, использовали этот основной цвет.


person nhaarman    schedule 12.09.2014    source источник
comment
Вы понятия не имеете, что такое частные внутренние компоненты Android для несуществующей версии Android. Не думайте, что внутреннее устройство L такое же, как и у того, во что L превращается в производственной версии.   -  person CommonsWare    schedule 13.09.2014
comment
Нет, в тему нельзя размещать произвольные данные. Тем не менее, colorPrimary используется только для фона панели действий, цвета панели последних и цвета уведомлений, и вы можете изменять все это динамически.   -  person alanv    schedule 13.09.2014
comment
Я думаю, вам следует спросить, как изменить атрибут стиля во время выполнения, и, судя по тому, что я видел, вы не можете. Однако у меня есть идея, которая может вам помочь. Используйте настраиваемый ContextWrapper и предоставьте собственные ресурсы. Посмотрите на это: github.com/ negusoft / holoaccent / blob / master / HoloAccent / src / com / В целом этот проект может дать вам представление о том, как это сделать.   -  person Mikooos    schedule 13.09.2014
comment
Как насчет этого предложения? Это либо наличие всех желаемых цветов в темах, либо перегрузка представлений настраиваемыми, которые позволяют изменять их цвета. stackoverflow.com/questions/25354558/   -  person Jürgen 'Kashban' Wahlmann    schedule 20.10.2014
comment
@ Jürgen'Kashban'Wahlmann К сожалению, я не хочу этого делать - мне нужен динамический контроль над цветами, без необходимости вручную создавать темы для всех возможных цветов.   -  person nhaarman    schedule 20.10.2014
comment
@NiekHaarman Затем вам нужно создать пользовательские представления из всех представлений, на которых вы хотите использовать эти цвета. Возможно, будущие версии Android позволят менять основной цвет на лету. Интересно: есть эта новая функция палитры для получения основных цветов из изображений. Я понимаю, что они используются для изменения цвета темы для согласованного просмотра при отображении таких изображений. Есть какие-нибудь подсказки по образцу приложения Palette, если таковое существует?   -  person Jürgen 'Kashban' Wahlmann    schedule 20.10.2014
comment
Просто мозги здесь, но весь XML конвертируется в файлы .dex, которые правильно загружаются в ваше приложение Android как объекты Java. Разве это не означает, что мы должны иметь возможность создавать и настраивать целые темы из кода, а также генерировать тему из фабрики, которую еще предстоит написать? Похоже, много работы.   -  person G_V    schedule 21.10.2014
comment
Библиотека GreenMatter может помочь вам достичь нужной функциональности: github.com/negusoft/GreenMatter   -  person blurkidi    schedule 04.04.2015
comment
@NiekHaarman Вы когда-нибудь находили способ?   -  person gbhall    schedule 07.04.2015
comment
Привет, могу ли я установить colorPrimary из кода Java вместо настройки через файл xml?   -  person Akshay kumar    schedule 28.08.2017
comment
Вы можете использовать Cyanea для динамической установки основных и акцентных цветов: github.com/jaredrummler/Cyanea   -  person Jared Rummler    schedule 03.12.2018


Ответы (9)


Темы неизменны, вы не можете.

person Chris Banes    schedule 22.10.2014
comment
Спасибо, Крис! Не тот ответ, который я искал, но думаю, мне придется с этим жить :) - person nhaarman; 22.10.2014
comment
Привет, @Chris Banes, но как приложение для контактов изменило цвет строки состояния и цвет панели инструментов в соответствии с цветом темы контакта? Если это возможно, я думаю, что потребности Ника Хаармана не так уж велики, поскольку ему нужно сохранить только тот цветовой код, который хочет пользователь. Не могли бы вы объяснить это поподробнее? Я тоже хочу создать что-то подобное, но меня это очень смущает. - person Swan; 25.10.2014
comment
Цвет строки состояния может быть изменен динамически с помощью Window.setStatusBarColor (). - person Chris Banes; 26.10.2014
comment
Можно ли программно создать тему? - person Andrew Orobator; 06.02.2015
comment
И при динамическом изменении цвета строки состояния вы также можете изменить цвет панели навигации через Window.setNavigationBarColor () - API 21 :) - person user802421; 30.04.2015
comment
Я так не думаю. Ознакомьтесь с приложением Lifx. Тема меняет цвет в соответствии с цветовым кругом. - person TheOnlyAnil; 01.05.2015
comment
разве вы не можете добавить эти возможности в Android M? - person Krupal Shah; 12.07.2015
comment
Темы не строго неизменяемы, см. Мой ответ. - person devconsole; 19.06.2016
comment
@AndrewOrobator По состоянию на 2020 год это не так. - person frezq; 25.06.2020

Я читал комментарии о приложении для контактов и о том, как в нем используется тема для каждого контакта.

Возможно, в приложении "Контакты" есть несколько предопределенных тем (для каждого основного цвета материала отсюда: http://www.google.com/design/spec/style/color.html).

Вы можете применить тему перед методом setContentView внутри метода onCreate.

Затем приложение контактов может случайным образом применить тему к каждому пользователю.

Этот метод:

setTheme(R.style.MyRandomTheme);

Но у этого метода есть проблема, например, он может изменить цвет панели инструментов, цвет эффекта прокрутки, цвет ряби и т. Д., Но он не может изменить цвет строки состояния и цвет панели навигации (если вы тоже хотите изменить его).

Затем для решения этой проблемы вы можете использовать метод до и:

if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.md_red_500));
        getWindow().setStatusBarColor(getResources().getColor(R.color.md_red_700));
    }

Эти два метода изменяют цвет панели навигации и строки состояния. Помните, что если вы установите полупрозрачную панель навигации, вы не сможете изменить ее цвет.

Это должен быть окончательный код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTheme(R.style.MyRandomTheme);
    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.myrandomcolor1));
        getWindow().setStatusBarColor(getResources().getColor(R.color.myrandomcolor2));
    }
    setContentView(R.layout.activity_main);

}

Вы можете использовать переключатель и сгенерировать случайное число, чтобы использовать случайные темы, или, как в приложении контактов, каждый контакт, вероятно, имеет заранее определенный связанный номер.

Образец темы:

<style name="MyRandomTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/myrandomcolor1</item>
    <item name="colorPrimaryDark">@color/myrandomcolor2</item>
    <item name="android:navigationBarColor">@color/myrandomcolor1</item>
</style>
person JavierSegoviaCordoba    schedule 19.01.2015
comment
Спасибо за ваш ответ. К сожалению, я попросил использовать произвольный цвет. Конечно, невозможно создавать темы для всех цветов. - person nhaarman; 20.01.2015
comment
@DanielGomezRico - AFAIK вы можете переопределить предустановленную тему независимо от того, где она изначально установлена ​​- если вы делаете это достаточно рано. Как сказано в ответе Вы можете применить тему перед методом setContentView внутри метода onCreate. - person ToolmakerSteve; 30.11.2019

Вы можете использовать Theme.applyStyle, чтобы изменить вашу тему во время выполнения, применив к ней другой стиль.

Допустим, у вас есть следующие определения стиля:

<style name="DefaultTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/md_lime_500</item>
    <item name="colorPrimaryDark">@color/md_lime_700</item>
    <item name="colorAccent">@color/md_amber_A400</item>
</style>

<style name="OverlayPrimaryColorRed">
    <item name="colorPrimary">@color/md_red_500</item>
    <item name="colorPrimaryDark">@color/md_red_700</item>
</style>

<style name="OverlayPrimaryColorGreen">
    <item name="colorPrimary">@color/md_green_500</item>
    <item name="colorPrimaryDark">@color/md_green_700</item>
</style>

<style name="OverlayPrimaryColorBlue">
    <item name="colorPrimary">@color/md_blue_500</item>
    <item name="colorPrimaryDark">@color/md_blue_700</item>
</style>

Теперь вы можете исправить свою тему во время выполнения следующим образом:

getTheme().applyStyle(R.style.OverlayPrimaryColorGreen, true);

Метод applyStyle должен быть вызван перед раздутием макета! Поэтому, если вы не загружаете представление вручную, вам следует применить стили к теме перед вызовом setContentView в своей деятельности.

Конечно, это нельзя использовать для указания произвольного цвета, то есть одного из 16 миллионов (256 3) цветов. Но если вы напишете небольшую программу, которая генерирует для вас определения стилей и код Java, тогда будет возможно что-то вроде одного из 512 (8 3).

Что делает это интересным, так это то, что вы можете использовать разные стили наложения для разных аспектов вашей темы. Просто добавьте, например, несколько определений наложения для colorAccent. Теперь вы можете почти произвольно комбинировать разные значения для основного цвета и цвета акцента.

Вы должны убедиться, что определения вашей темы наложения не наследуют случайно набор определений стиля из определения родительского стиля. Например, стиль с именем AppTheme.OverlayRed неявно наследует все стили, определенные в AppTheme, и все эти определения также будут применены при исправлении основной темы. Поэтому либо избегайте точек в названиях тем оверлея, либо используйте что-то вроде Overlay.Red и определите Overlay как пустой стиль.

person devconsole    schedule 19.06.2016
comment
Попробуйте позвонить applyStyle перед вызовом setContentView в своей деятельности, и это должно сработать. - person devconsole; 27.09.2016
comment
да ладно, тогда это может сработать! Я ищу способ изменить цвет во фрагменте niveau, а не активности! Вот почему у меня это, к сожалению, не сработало: ‹Мой вариант использования состоит в том, что мне нужны разные цвета для индикаторов FAB или вкладок при переключении с вкладок, которые будут запускать другой фрагмент! - person Dennis Anderson; 27.09.2016
comment
Спасибо, это очень помогло! Однако я не могу делать это несколько раз. (один для colorPrimary, один для colorAccent и т. д.). Не могли бы вы помочь мне? Спасибо. stackoverflow .com / questions / 41779821 / - person Thomas Vos; 21.01.2017
comment
Это тот ответ, для которого я хочу использовать вторую учетную запись, просто чтобы еще раз +1. Спасибо. - person Benoit Duffez; 26.03.2018
comment
Большое вам спасибо, это было то, что я искал .... Надеюсь, я смогу изменить цвет акцента текущей темы, используя этот подход. - person Nasib; 09.11.2019

Я создал какое-то решение для создания тем любого цвета, может быть, это кому-нибудь пригодится. API 9+

1. сначала создайте res / values-v9 / и поместите туда этот файл: styles.xml и обычная папка res / values ​​будет использоваться с вашими стилями.

2. поместите этот код в свой файл res / values ​​/ styles.xml:

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">#000</item>
        <item name="colorPrimaryDark">#000</item>
        <item name="colorAccent">#000</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    </style>

    <style name="AppThemeDarkActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">#000</item>
        <item name="colorPrimaryDark">#000</item>
        <item name="colorAccent">#000</item>
        <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    </style>

    <style name="WindowAnimationTransition">
        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>
</resources>

3. в AndroidManifest:

<application android:theme="@style/AppThemeDarkActionBar">

4. создайте новый класс с именем ThemeColors.java.

public class ThemeColors {

    private static final String NAME = "ThemeColors", KEY = "color";

    @ColorInt
    public int color;

    public ThemeColors(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
        String stringColor = sharedPreferences.getString(KEY, "004bff");
        color = Color.parseColor("#" + stringColor);

        if (isLightActionBar()) context.setTheme(R.style.AppTheme);
        context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
    }

    public static void setNewThemeColor(Activity activity, int red, int green, int blue) {
        int colorStep = 15;
        red = Math.round(red / colorStep) * colorStep;
        green = Math.round(green / colorStep) * colorStep;
        blue = Math.round(blue / colorStep) * colorStep;

        String stringColor = Integer.toHexString(Color.rgb(red, green, blue)).substring(2);
        SharedPreferences.Editor editor = activity.getSharedPreferences(NAME, Context.MODE_PRIVATE).edit();
        editor.putString(KEY, stringColor);
        editor.apply();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) activity.recreate();
        else {
            Intent i = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName());
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            activity.startActivity(i);
        }
    }

    private boolean isLightActionBar() {// Checking if title text color will be black
        int rgb = (Color.red(color) + Color.green(color) + Color.blue(color)) / 3;
        return rgb > 210;
    }
}

5. MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new ThemeColors(this);
        setContentView(R.layout.activity_main);
    }

    public void buttonClick(View view){
        int red= new Random().nextInt(255);
        int green= new Random().nextInt(255);
        int blue= new Random().nextInt(255);
        ThemeColors.setNewThemeColor(MainActivity.this, red, green, blue);
    }
}

Чтобы изменить цвет, просто замените Random на свой RGB, надеюсь, это поможет.

введите описание изображения здесь

Вот полный пример: ColorTest.zip

person IQ.feature    schedule 30.01.2018
comment
можешь поделится проектом как? - person Erselan Khan; 01.11.2018
comment
Создайте новый проект, загрузите файл - styles.xml и используйте приведенный выше код. Удачи. - person IQ.feature; 05.11.2018
comment
Я не могу осмыслить context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));, можете ли вы дать мне объяснение или ссылку для продолжения по этой теме? - person Langusten Gustel; 25.12.2018
comment
Посмотри в файле styles.xml ... там список доступных тем. context.setTheme (context.getResources (). getIdentifier (T_ + stringColor, style, context.getPackageName ())); Получить одну из тем по названию. - person IQ.feature; 27.12.2018
comment
Думаю, воссоздание деятельности занимает слишком много времени. Я использую обновление при переходе к новому фрагменту с нижней панелью навигации, и заметна задержка при воссоздании цветов. - person Rowan Gontier; 09.04.2019
comment
@ IQ.feature Я думаю, что размещение вашего кода в репозитории Github больше подходит для совместного использования кода - person Vadim Kotov; 13.12.2019
comment
Просто чтобы прояснить для других, потому что я попался на это ... есть файл res-v9 / styles.xml, который объявляет целый список тем с разными цветами, и код, по сути, применяет одну из этих тем и воссоздает действие. Это то, чего также пытались достичь другие ответы ... т.е. это обходной путь путем предопределения тем, а не программного или динамического создания тем. - person frezq; 25.06.2020
comment
Вы не можете этого сделать ... Нет возможности создавать темы динамически. - person IQ.feature; 01.07.2020
comment
как мне получить цвет как int из этого класса и установить фон виджета? - person Noor Hossain; 21.12.2020
comment
int color = R.color.colorPrimary, остается прежним, почему? - person Noor Hossain; 21.12.2020
comment
Посмотрите buttonClick, это пример того, как вызвать функцию с новой темой. RGB - принимайте значения типа int, какие хотите. - person IQ.feature; 21.12.2020

Я использовал код Dahnark, но мне также нужно изменить фон ToolBar:

if (dark_ui) {
    this.setTheme(R.style.Theme_Dark);

    if (Build.VERSION.SDK_INT >= 21) {
        getWindow().setNavigationBarColor(getResources().getColor(R.color.Theme_Dark_primary));
        getWindow().setStatusBarColor(getResources().getColor(R.color.Theme_Dark_primary_dark));
    }
} else {
    this.setTheme(R.style.Theme_Light);
}

setContentView(R.layout.activity_main);

toolbar = (Toolbar) findViewById(R.id.app_bar);

if(dark_ui) {
    toolbar.setBackgroundColor(getResources().getColor(R.color.Theme_Dark_primary));
}
person lgallard    schedule 18.04.2015
comment
добавьте этот код: android: background =? attr / colorPrimary на свою панель инструментов (в файле .xml), поэтому вам не нужно устанавливать фон в java. - person JavierSegoviaCordoba; 22.04.2015
comment
Но у меня есть две разные панели инструментов, одна для светлой темы, другая для темной темы. Если я добавлю android: background =? Attr / colorPrimary, мне придется использовать какой-то селектор. - person lgallard; 19.05.2015
comment
У меня было много тем, и я использую только этот код. Взгляните на это приложение: play.google.com / store / apps / - person JavierSegoviaCordoba; 19.05.2015

Вы не можете изменить цвет colorPrimary, но вы можете изменить тему своего приложения, добавив новый стиль с другим цветом.

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

<style name="AppTheme.NewTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorOne</item>
    <item name="colorPrimaryDark">@color/colorOneDark</item>
</style>

и внутри темы набора действий

 setTheme(R.style.AppTheme_NewTheme);
 setContentView(R.layout.activity_main);
person varghesekutty    schedule 24.09.2018
comment
Я вижу, что уже есть более ранние ответы, описывающие стили переключения. В какой ситуации ваш ответ более уместен? И для ясности, вопрос гласит: Во время выполнения пользователь решает, что он хочет использовать #ccffff в качестве основного цвета. Конечно, я не могу создавать темы для всех возможных цветов. Это не решает эту задачу; однако, если бы никто не описал, как это сделать, было бы полезно знать. - person ToolmakerSteve; 30.11.2019
comment
@ToolmakerSteve Получили ли вы какое-нибудь решение? - person sejn; 30.10.2020
comment
@sejn - вы делаете что-то похожее на этот ответ - и затем вы должны удалить (вытолкнуть из стека навигации) все, что отображается на экране, и снова нажать его новый экземпляр - чтобы снова повторить раздувание, создавая новое представление с измененной темой. Точные детали зависят от того, используете ли вы фрагменты, и можете легко заменить текущий, или вместо этого необходимо перезапустить текущее действие. Google в другом месте, чтобы получить помощь с этим шагом, или опубликуйте новый вопрос с описанием того, что вам нужно сделать - обратитесь к этим вопросам и ответам, объясните шаг, который вы не решили. - person ToolmakerSteve; 30.10.2020

из деятельности, которую вы можете делать:

getWindow().setStatusBarColor(i color);
person yeahdixon    schedule 05.12.2014
comment
Забавно, что этот ответ получил -8 голосов, но решает мою проблему: D - person Nabin Bhandari; 20.07.2017

ИСПОЛЬЗУЙТЕ ПАНЕЛЬ ИНСТРУМЕНТОВ

Вы можете динамически установить собственный цвет элемента панели инструментов, создав собственный класс панели инструментов:

package view;

import android.app.Activity;
import android.content.Context;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.support.v7.internal.view.menu.ActionMenuItemView;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomToolbar extends Toolbar{

    public CustomToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }

    public CustomToolbar(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    public CustomToolbar(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        ctxt = context;
    }

    int itemColor;
    Context ctxt;

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        Log.d("LL", "onLayout");
        super.onLayout(changed, l, t, r, b);
        colorizeToolbar(this, itemColor, (Activity) ctxt);
    } 

    public void setItemColor(int color){
        itemColor = color;
        colorizeToolbar(this, itemColor, (Activity) ctxt);
    }



    /**
     * Use this method to colorize toolbar icons to the desired target color
     * @param toolbarView toolbar view being colored
     * @param toolbarIconsColor the target color of toolbar icons
     * @param activity reference to activity needed to register observers
     */
    public static void colorizeToolbar(Toolbar toolbarView, int toolbarIconsColor, Activity activity) {
        final PorterDuffColorFilter colorFilter
                = new PorterDuffColorFilter(toolbarIconsColor, PorterDuff.Mode.SRC_IN);

        for(int i = 0; i < toolbarView.getChildCount(); i++) {
            final View v = toolbarView.getChildAt(i);

            doColorizing(v, colorFilter, toolbarIconsColor);
        }

      //Step 3: Changing the color of title and subtitle.
        toolbarView.setTitleTextColor(toolbarIconsColor);
        toolbarView.setSubtitleTextColor(toolbarIconsColor);
    }

    public static void doColorizing(View v, final ColorFilter colorFilter, int toolbarIconsColor){
        if(v instanceof ImageButton) {
            ((ImageButton)v).getDrawable().setAlpha(255);
            ((ImageButton)v).getDrawable().setColorFilter(colorFilter);
        }

        if(v instanceof ImageView) {
            ((ImageView)v).getDrawable().setAlpha(255);
            ((ImageView)v).getDrawable().setColorFilter(colorFilter);
        }

        if(v instanceof AutoCompleteTextView) {
            ((AutoCompleteTextView)v).setTextColor(toolbarIconsColor);
        }

        if(v instanceof TextView) {
            ((TextView)v).setTextColor(toolbarIconsColor);
        }

        if(v instanceof EditText) {
            ((EditText)v).setTextColor(toolbarIconsColor);
        }

        if (v instanceof ViewGroup){
            for (int lli =0; lli< ((ViewGroup)v).getChildCount(); lli ++){
                doColorizing(((ViewGroup)v).getChildAt(lli), colorFilter, toolbarIconsColor);
            }
        }

        if(v instanceof ActionMenuView) {
            for(int j = 0; j < ((ActionMenuView)v).getChildCount(); j++) {

                //Step 2: Changing the color of any ActionMenuViews - icons that
                //are not back button, nor text, nor overflow menu icon.
                final View innerView = ((ActionMenuView)v).getChildAt(j);

                if(innerView instanceof ActionMenuItemView) {
                    int drawablesCount = ((ActionMenuItemView)innerView).getCompoundDrawables().length;
                    for(int k = 0; k < drawablesCount; k++) {
                        if(((ActionMenuItemView)innerView).getCompoundDrawables()[k] != null) {
                            final int finalK = k;

                            //Important to set the color filter in seperate thread, 
                            //by adding it to the message queue
                            //Won't work otherwise. 
                            //Works fine for my case but needs more testing

                            ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter);

//                              innerView.post(new Runnable() {
//                                  @Override
//                                  public void run() {
//                                      ((ActionMenuItemView) innerView).getCompoundDrawables()[finalK].setColorFilter(colorFilter);
//                                  }
//                              });
                        }
                    }
                }
            }
        }
    }



}

затем обратитесь к нему в своем файле макета. Теперь вы можете установить собственный цвет, используя

toolbar.setItemColor(Color.Red);

Источники:

Я нашел информацию для этого здесь: Как динамически изменить цвет значков панели инструментов Android

а затем я отредактировал его, улучшил и разместил здесь: GitHub: AndroidDynamicToolbarItemColor

person Michael Kern    schedule 21.05.2015
comment
Это не отвечает на вопрос. В частности, моя цель состоит в том, чтобы в конечном итоге ActionBar и все виджеты, такие как CheckBox, использовали этот основной цвет.. - person nhaarman; 21.05.2015
comment
Затем просто добавьте, чтобы установить флажок. Например, добавьте if (v instanceof CheckBox) {themeChexnoxWithColor (toolbarIconsColor); Я не понимаю, почему это не отвечает на ваш вопрос честно - person Michael Kern; 21.05.2015
comment
@nhaarman вы можете динамически установить цвет панели действий, например, stackoverflow.com/questions/23708637/change-actionbar-background-color-dynamically, я просто не совсем понимаю ваш вопрос - person Michael Kern; 21.05.2015
comment
У меня есть приложение, в котором пользователь может выбрать цвет панели действий и цвета элементов панели действий. Я не вижу что тебе еще нужно - person Michael Kern; 21.05.2015
comment
Даже если это отвечает только на часть вашего вопроса, это все равно большая и важная часть. - person Michael Kern; 21.05.2015
comment
Это мне очень помогло. - person Firefly; 13.07.2015

Вот что вы МОЖЕТЕ сделать:

напишите файл в папку с возможностью переноса, назовите его background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="?attr/colorPrimary"/>
</shape>

затем установите свой макет (или что-то еще) android:background="@drawable/background"

при установке вашей темы этот цвет будет таким же.

person Ustaad    schedule 12.05.2016