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