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

Есть ли способ программно изменить основные цвета. Я хотел бы сделать это в коде, зависящем от экрана/состояния приложения.

В настоящее время я могу установить только цвета в теме (статические):

    <item name="android:colorPrimary">@color/primary_color</item>
    <item name="android:colorPrimaryDark">@color/dark_color</item>
    <item name="android:colorBackground">@android:color/white</item>
    <item name="android:colorAccent">@color/primary_color</item>
    <item name="android:colorControlHighlight">@color/primary_color</item>

Спасибо

Ответ 1

Конечно, вы можете реализовать пользовательские подклассы View, которые имеют методы для настройки цветов.

Вы также можете определить несколько тем с различными цветовыми схемами.

Представления ищут информацию о теме из контекста при их создании. Таким образом, чтобы изменить стили, примененные к теме, вам придется воссоздать иерархию представления с контекстом, в котором используется правильная тема.

Один из способов сделать это - создать новый ContextThemeWrapper, а затем получить LayoutInflator, который использует эту оболочку темы, удалить старую версию макета и заново накачать его.

Грубо:

ContextThemeWrapper themeWrapper = new ContextThemeWrapper(this, R.style.AppThemeWithColorScheme2);
LayoutInflater layoutInflater = LayoutInflater.from(themeWrapper);
viewContainer.removeAllViews();
layoutInflater.inflate(R.layout.my_layout, viewContainer, true );

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

Ответ 2

Используйте этот код для настройки панели инструментов и строки состояния (более темный цвет панели инструментов)

toolbar.setBackgroundColor(toolbarColor);
factor=0.8f; 
int a = Color.alpha(toolbarcolor);
int r = Math.round(Color.red(toolbarcolor) * factor);
int g = Math.round(Color.green(toolbarcolor) * factor);
int b = Math.round(Color.blue(toolbarcolor) * factor);
int statusColor=Color.argb(a,
        Math.min(r, 255),
        Math.min(g, 255),
        Math.min(b, 255));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = MainActivity.this.getWindow();
    window.setStatusBarColor(statusColor);
}

Ответ 3

Это наиболее практично, без ошибок, нет необходимости делать дополнительное кодирование, просто зайдите в проект дерева Android

res> values> colors, затем отредактируйте эти коды:

 <resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>
</resources>

добавьте их под стиль:

<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

добавить в манифест сразу после ".MainActivity":

android:theme="@style/AppTheme.NoActionBar">

Ответ 4

Это изменить все в тексте

<item name="android:textColorPrimary">@color/textGrey</item>
    <item name="android:textColorSecondary">@color/textGrey</item>
    <item name="android:textColorTertiary">@color/textGrey</item>
    <item name="android:listDivider">@color/textGrey</item>