Próbuję ustawić motyw dla fragmentu.
Ustawienie motywu w manifeście nie działa:
android:theme="@android:style/Theme.Holo.Light"
Patrząc na poprzednie blogi, wydaje się, że muszę użyć ContextThemeWrapper. Czy ktoś może skierować mnie do zakodowanego przykładu? Nie mogę nic znaleźć.
android
android-fragments
android-theme
user1232691
źródło
źródło
Fragment bierze swój motyw z jego Aktywności. Każdemu fragmentowi przypisywany jest temat Działania, w którym występuje.
Motyw jest stosowany w metodzie Fragment.onCreateView, w której kod tworzy widoki, które w rzeczywistości są obiektami, w których jest używany motyw.
W Fragment.onCreateView dostajesz parametr LayoutInflater, który rozszerza widoki i przechowuje kontekst używany dla motywu, w rzeczywistości jest to Activity. Więc Twoje zawyżone widoki używają motywu Aktywności.
Aby nadpisać motyw, możesz wywołać LayoutInflater.cloneInContext , który wspomina w Dokumentach, że może być używany do zmiany motywu. Możesz tutaj użyć ContextThemeWrapper. Następnie użyj sklonowanego inflatera, aby utworzyć widoki fragmentów.
źródło
Do zastosowania jednego stylu właśnie użyłem
w
onCreateView()
fragmencie przed nadmuchaniem widoku root fragmentu i u mnie działa.źródło
getContext()
Próbowałem również wyświetlić okno dialogowe fragmentów z innym motywem niż jego aktywność i zastosowałem to rozwiązanie . Podobnie jak niektóre osoby wspomniane w komentarzach, nie działało, a okno dialogowe wyświetlało się z tematem określonym w manifeście. Problemem okazało się, że budował dialog używając
AlertDialog.Builder
wonCreateDialog
sposób i tak nie robił stosowanieonCreateView
metody jak pokazano w odpowiedzi, że powiązany. A kiedy tworzyłem instancjęAlertDialog.Builder
I przechodziłem w kontekście używając,getActivity()
kiedy powinienem był używać instancjiConstextThemeWrapper
zamiast tego.Oto kod mojego onCreateDialog:
Pierwotnie
AlertDialog.Builder
utworzyłem instancję w następujący sposób:które zmieniłem na:
Po tej zmianie pojawiło się okno dialogowe fragmentu z poprawnym motywem. Więc jeśli ktoś ma podobny problem i korzysta z
AlertDialog.Builder
tego, sprawdź kontekst przekazywany do buildera. Mam nadzieję że to pomoże! :)źródło
Upewnij się, że
android:minSdkVersion="11"
ustawiłeś w swoim manifeście. To może być powód, dla którego przykład Davida nie zadziałał dla ciebie.Ustaw również
android:theme="@android:style/Theme.Holo.Light"
atrybut dla<application>
tagu, a NIE dla<activity>
tagu.Innym możliwym problemem może być sposób uzyskiwania kontekstu podczas korzystania z pliku
ContextThemeWrapper()
. Jeśli używasz czegoś takiego,getActivity().getApplicationContext()
po prostu zamień to nagetActivity()
.Zwykle Theme.Holo powinno dotyczyć fragmentów połączonych z MainActivity.
Zwróć uwagę, że używasz ContextThemeWrapper, gdy chcesz zastosować inny motyw dla swojego fragmentu. Może pomóc, jeśli podasz fragment kodu z MainActivity, w którym dodasz swoje fragmenty.
Kilka przydatnych linków:
Niestandardowy ListView w fragmencie nie jest zgodny z motywem nadrzędnym
źródło
Wypróbowałem rozwiązanie, które David zasugerował, że działa, ale nie we wszystkich scenariuszach:
1. dla pierwszego fragmentu, który został dodany do stosu, ma temat działania, a nie ten, który zdefiniowano w onCrateView, ale na drugim fragmencie, który i dodaj do stosu popraw, czy zostały nałożone na fragment.
2. Na drugim fragmencie, który wyświetlił się poprawnie, wykonałem następujące czynności: wymusiłem zamknięcie aplikacji poprzez wyczyszczenie pamięci, ponowne otwarcie aplikacji i po odtworzeniu działania z fragmentem Fragment zmienił ich błędnie Activity, a nie to samo, które zostało ustawione w onCrateView fragmentu.
Aby rozwiązać ten problem, dokonałem niewielkiej zmiany i zastąpiłem argument kontenera z inflater.inflate wartością null.
Nie wiem, w jaki sposób inflater wykorzystuje w niektórych scenariuszach kontekst z widoku kontenera.
Uwaga - używam android.support.v4.app.Fragment & android.support.v7.app.AppCompatActivity.
źródło
Wiem, że jest trochę za późno, ale może pomóc komuś innemu, ponieważ pomogło mi.Możesz także spróbować dodać wiersz kodu poniżej wewnątrz funkcji onCreatView fragmentu
źródło
Utwórz klasę Java, a następnie użyj układu, którego motyw chcesz zmienić w metodzie onCreate, a następnie wspomnij o tym w pliku manifestu jak zwykle
źródło
Jeśli chcesz tylko zastosować styl do konkretnego fragmentu, po prostu dodaj te linie przed wywołaniem
onCreateView()
lubonAttach()
fragmentem,a jeśli chcesz ustawić przezroczysty pasek stanu, ustaw wartość false dla
fitsSystemWindows
właściwości układu głównego,źródło
Mam to do pracy, ustawiając motyw w kontekście fragmentu przed wywołaniem inflatora.
UWAGA: To jest przykład dla platformy Xamarin.Android w połączeniu z MvvmCross. Nie jestem w 100% pewien, czy to zadziała również dla programistów Java. Ale możesz spróbować :)
Kod metody rozszerzenia SetTheme
Mam nadzieję, że to pomoże niektórym ludziom, na zdrowie!
źródło
Rozwiązałem problem używając
android:theme = "@style/myTheme"
w pliku układu fragmentu. Na przykład zmienia to styl plikuLinearLayout
i jego zawartość, ale nie zmienia niczego pozaLinearLayout
. Tak więc, aby ozdobić cały fragment dowolnym stylem, zastosuj motyw do jego zewnętrznego układu nadrzędnego.Uwaga: na wszelki wypadek, jeśli jeszcze nie znalazłeś rozwiązania, możesz spróbować.
źródło
możesz spróbować tego dla Lollipopa w onAttach
final Window window = activity.getWindow (); window.setStatusBarColor (myStatusBarColor)
i ustaw go z powrotem na domyślny w ondettach
źródło