Прежде всего, этот вопрос задает очень похожий вопрос. Однако у моего вопроса есть небольшая разница.
Я хотел бы знать, можно ли программно изменить 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
использовать этот основной цвет.
android
android-5.0-lollipop
nhaarman
источник
источник
Ответы:
Темы неизменны, вы не можете.
источник
Я читаю комментарии о приложении контактов и о том, как оно использует тему для каждого контакта.
Вероятно, приложение контактов имеет несколько предопределенных тем (для каждого основного цвета материала отсюда: http://www.google.com/design/spec/style/color.html ).
Вы можете применить тему перед методом setContentView внутри метода onCreate.
Затем приложение «Контакты» может применить тему произвольно для каждого пользователя.
Этот метод:
Но у этого метода есть проблема, например, он может изменить цвет панели инструментов, цвет эффекта прокрутки, цвет ряби и т. Д., Но он не может изменить цвет строки состояния и цвет панели навигации (если вы хотите изменить его тоже).
Затем для решения этой проблемы вы можете использовать метод до и:
Эти два метода меняют навигацию и цвет строки состояния. Помните, что если вы установите прозрачную панель навигации, вы не сможете изменить ее цвет.
Это должен быть окончательный код:
Вы можете использовать переключатель и генерировать случайное число, чтобы использовать случайные темы, или, как и в приложении контактов, каждому контакту, вероятно, присвоен заранее определенный номер.
Образец темы:
Извините за мой английский.
источник
Вы можете использовать Theme.applyStyle для изменения вашей темы во время выполнения, применяя к ней другой стиль.
Допустим, у вас есть эти определения стиля:
Теперь вы можете исправлять свою тему во время выполнения следующим образом:
Метод
applyStyle
должен быть вызван до того, как макет будет раздут! Поэтому, если вы не загружаете представление вручную, вы должны применять стили к теме, прежде чем вызыватьsetContentView
вашу деятельность.Конечно, это не может использоваться для указания произвольного цвета, то есть одного из 16 миллионов (256 3 ) цветов. Но если вы напишете небольшую программу, которая генерирует определения стилей и код Java для вас, то должно быть возможно что-то вроде одной из 512 (8 3 ).
Что делает это интересным, так это то, что вы можете использовать разные стили наложения для разных аспектов вашей темы. Просто добавьте несколько определений наложения,
colorAccent
например. Теперь вы можете комбинировать разные значения основного цвета и цвета акцента практически произвольно.Вы должны убедиться, что определения вашей оверлейной темы случайно не наследуют набор определений стилей из определения родительского стиля. Например, стиль, называемый
AppTheme.OverlayRed
неявно, наследует все стили, определенные в,AppTheme
и все эти определения также будут применены, когда вы исправите основную тему. Поэтому избегайте точек в именах наложенных тем или используйте что-то подобноеOverlay.Red
и определитеOverlay
пустой стиль.источник
applyStyle
прежде чем звонитьsetContentView
в вашей деятельности, и это должно работать.Я создал какое-то решение для создания любых цветовых тем, может быть, это кому-нибудь пригодится. API 9+
1. сначала создайте « res / values-v9 / » и поместите туда этот файл: styles.xml и обычная папка «res / values» будут использоваться с вашими стилями.
2. поместите этот код в ваш файл res / values / styles.xml:
3. в AndroidManifest:
4. создать новый класс с именем "ThemeColors.java"
5. MainActivity:
Чтобы изменить цвет, просто замените Random на RGB, надеюсь, это поможет.
Вот полный пример: ColorTest.zip
источник
context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
ли вы дать мне объяснение или ссылку для продолжения этой темы?Я использовал код Dahnark, но мне также нужно изменить фон панели инструментов:
источник
Вы не можете изменить цвет colorPrimary, но вы можете изменить тему вашего приложения, добавив новый стиль с другим цветом colorPrimary.
и внутри заданной темы
источник
из деятельности вы можете сделать:
источник
ИСПОЛЬЗУЙТЕ ИНСТРУМЕНТ
Вы можете динамически установить цвет элемента панели инструментов , создав собственный класс панели инструментов:
затем обратитесь к нему в вашем файле макета. Теперь вы можете установить собственный цвет, используя
Источники:
Я нашел информацию для этого здесь: Как динамически менять цвет значков панели инструментов Android
а затем я отредактировал его, улучшил его и разместил здесь: GitHub: AndroidDynamicToolbarItemColor
источник
Это то, что вы можете сделать:
записать файл в папку drawable, назовем его background.xml
затем установите свой макет (или как это бывает)
android:background="@drawable/background"
при настройке вашей темы этот цвет будет представлять то же самое.
источник