Как программно изменить основной цвет в 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>

Спасибо

2 ответа

Решение

Конечно, вы можете реализовать пользовательские подклассы 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 );

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

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

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);
}

Это меняет все в тексте

<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>

Это наиболее практично без ошибок, нет необходимости выполнять дополнительное кодирование, просто перейдите в проект дерева 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">
Другие вопросы по тегам