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


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

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

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

один из способов сделать это-создать новый 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 );

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


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

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