Przede wszystkim to pytanie stawia bardzo podobne pytanie. Jednak moje pytanie ma subtelną różnicę.
Chciałabym wiedzieć, czy można programowo zmienić colorPrimary
atrybut motywu na dowolny kolor?
Na przykład mamy:
<style name="AppTheme" parent="android:Theme.Material.Light">
<item name="android:colorPrimary">#ff0000</item>
<item name="android:colorAccent">#ff0000</item>
</style>
W czasie wykonywania użytkownik decyduje, że chce użyć #ccffff
koloru podstawowego. Oczywiście nie ma możliwości tworzenia motywów dla wszystkich możliwych kolorów.
Nie mam nic przeciwko temu, że muszę robić hakerskie rzeczy, takie jak poleganie na prywatnych wewnętrznych elementach Androida, o ile działa on przy użyciu publicznego SDK.
Moim celem jest, aby w końcu mieć ActionBar
i wszystkie widżety, jak CheckBox
korzystać z tego koloru podstawowego.
android
android-5.0-lollipop
nhaarman
źródło
źródło
Odpowiedzi:
Motywy są niezmienne, nie możesz.
źródło
Czytałem komentarze na temat aplikacji kontaktów i tego, jak używa ona motywu dla każdego kontaktu.
Prawdopodobnie aplikacja do kontaktów ma pewne predefiniowane motywy (dla każdego koloru podstawowego z tego materiału: http://www.google.com/design/spec/style/color.html ).
Motyw można zastosować przed metodą setContentView w metodzie onCreate.
Następnie aplikacja do kontaktów może losowo zastosować motyw dla każdego użytkownika.
Ta metoda to:
Ale ta metoda ma problem, na przykład może zmienić kolor paska narzędzi, kolor efektu przewijania, kolor tętnienia itp., Ale nie może zmienić koloru paska stanu i koloru paska nawigacji (jeśli chcesz go również zmienić).
Następnie, aby rozwiązać ten problem, możesz użyć metody przed i:
Te dwie metody zmieniają kolor paska nawigacji i stanu. Pamiętaj, że jeśli ustawisz pasek nawigacji jako półprzezroczysty, nie możesz zmienić jego koloru.
To powinien być ostateczny kod:
Możesz użyć przełącznika i wygenerować losową liczbę, aby użyć losowych motywów lub, tak jak w aplikacji kontaktów, każdy kontakt prawdopodobnie ma przypisany wstępnie zdefiniowany numer.
Próbka motywu:
Przepraszam za mój angielski.
źródło
Możesz użyć Theme.applyStyle, aby zmodyfikować swój motyw w czasie wykonywania, stosując do niego inny styl.
Załóżmy, że masz te definicje stylu:
Teraz możesz załatać swój motyw w czasie wykonywania, na przykład:
Metoda
applyStyle
musi zostać wywołana, zanim układ zostanie zawyżony! Jeśli więc nie załadujesz widoku ręcznie, powinieneś zastosować style do motywu przed wywołaniemsetContentView
działania.Oczywiście nie można tego użyć do określenia dowolnego koloru, tj. Jednego z 16 milionów (256 3 ) kolorów. Ale jeśli napiszesz mały program, który generuje dla ciebie definicje stylów i kod Javy, to coś w rodzaju jednego z 512 (8 3 powinno być możliwe ).
To, co sprawia, że jest to interesujące, to fakt, że możesz używać różnych nakładek stylu dla różnych aspektów motywu. Po prostu dodaj na przykład kilka definicji nakładek
colorAccent
. Teraz możesz niemal dowolnie łączyć różne wartości koloru podstawowego i koloru akcentującego .Należy się upewnić, że definicje motywów nakładek nie dziedziczą przypadkowo wielu definicji stylów z definicji stylu nadrzędnego. Na przykład styl o nazwie
AppTheme.OverlayRed
niejawnie dziedziczy wszystkie style zdefiniowane w programie,AppTheme
a wszystkie te definicje zostaną również zastosowane podczas łatania motywu głównego. Więc albo unikaj kropek w nazwach motywów nakładki, albo użyj czegoś podobnegoOverlay.Red
i zdefiniujOverlay
jako pusty styl.źródło
applyStyle
przed wezwaniemsetContentView
swojej aktywności i powinno działać.Stworzyłem rozwiązanie do tworzenia motywów w dowolnym kolorze, może to się komuś przyda. API 9+
1. Najpierw utwórz " res / values-v9 / " i umieść tam ten plik: styles.xml i zwykły folder "res / values" będą używane z Twoimi stylami.
2. Umieść ten kod w swoim res / values / styles.xml:
3. w AndroidManifest:
4. utwórz nową klasę o nazwie „ThemeColors.java”
5. MainActivity:
Aby zmienić kolor, po prostu zastąp Random swoim RGB, mam nadzieję, że to pomoże.
Oto pełny przykład: ColorTest.zip
źródło
context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
się otrząsnąć, czy możesz podać mi wyjaśnienie lub link do dalszych działań na ten temat?Użyłem kodu Dahnark, ale muszę też zmienić tło ToolBar:
źródło
Nie możesz zmienićkoloru colorPrimary, ale możesz zmienić motyw swojej aplikacji, dodając nowy styl z innym koloremKolor podstawowy
i wewnątrz motywu zestawu czynności
źródło
z aktywności, którą możesz wykonać:
źródło
UŻYJ PASKA NARZĘDZIOWEGO
Możesz ustawić niestandardowy pasek narzędzi dynamicznie kolor elementu tworząc niestandardową klasę paska narzędzi:
następnie odwołaj się do tego w pliku układu. Teraz możesz ustawić własny kolor za pomocą
Źródła:
Informacje, jak to zrobić, znalazłem tutaj: Jak dynamicznie zmieniać kolor ikon paska narzędzi Android
a potem go wyedytowałem, poprawiłem i opublikowałem tutaj: GitHub: AndroidDynamicToolbarItemColor
źródło
Oto, co MOŻESZ zrobić:
napisz plik w folderze do rysowania, nazwijmy go background.xml
następnie ustaw swój układ (lub cokolwiek tak jest)
android:background="@drawable/background"
przy ustawianiu motywu ten kolor będzie reprezentował to samo.
źródło