W przypadku nowego PreferenceFragmentCompat z biblioteki obsługi preferencji w wersji 7: http://developer.android.com/tools/support-library/features.html#v7-preference pojawia się ten błąd
E java.lang.IllegalStateException: Must specify preferenceTheme in theme
E at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:202)
Jaki motyw ustawić?
Aktualizacja: próbowałem użyć
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
zgodnie z sugestią @Bogato, ale nie wygląda dobrze i wygląda bardzo Holo nawet na Lollipopie.
Biblioteka wsparcia:
Natywne preferencje:
Odpowiedzi:
Poprawka jest dostępna jako zależność od gradle
Teraz można łatwo korzystać z biblioteki. Oto najszybszy sposób, aby to zrobić, ale zapoznaj się z README, aby uzyskać więcej informacji.
1. Zaktualizuj plik gradle modułu:
compile 'com.takisoft.fix:preference-v7:27.0.0.0'
2. Użyj odpowiedniej klasy jako podstawy swojego fragmentu
Możesz użyć albo
PreferenceFragmentCompat
lubPreferenceFragmentCompatDividers
.( Uważaj na odpowiednią nazwę pakietu podczas importowania
PreferenceFragmentCompat
! )3. Użyj odpowiedniego motywu
Ustaw motyw zawierający działanie na wariant
@style/PreferenceFixTheme
, taki jak NoActionBar, Light itp.PS W tej sekcji można było znaleźć szczegółowe rozwiązanie, które doprowadziło do powstania biblioteki, ale zdecydowałem się ją usunąć, ponieważ może to być mylące. Jeśli jesteś ciekawy kroków, nadal możesz je znaleźć w historii wersji tej odpowiedzi.
źródło
Musisz określić preferenceTheme w motywie działania preferencji.
Na przykład :
PreferenceThemeOverlay jest domyślnym motywem, który zawiera bibliotekę obsługującą preferencje v7.
źródło
Wygląda na to, że Google naprawił ten problem. Przetestowałem to z preferencją obsługi wersji 14 w wersji 25.3.1
1) Dodaj
implementation 'com.android.support:preference-v14:25.3.1'
do swojego Gradle.2) Dodaj
PreferenceThemeOverlay.v14.Material
do stylu zamiastPreferenceThemeOverlay
.3) Na koniec dodaj styl do Manifestu
źródło
preferenceTheme
sięPreferenceThemeOverlay.v14
wstyles.xml
orazPreferenceThemeOverlay.v14.Material
wstyles-v21.xml
rozwiązuje problem.minSdkVersion
między 14 a 20.Aby użyć PreferenceFragmentCompat , musisz ustawić
preferenceTheme
w swoim motywie:W ten sposób możesz dostosować
preferenceTheme
styl układów używanych dla każdego typu preferencji bez wpływu na inne części działania.źródło
Właśnie dodałem tę linię w motywie i działa idealnie na API 19 i nowszych.
źródło
Rozwiązanie, które działało dla mnie w API 25. Miałem ten domyślny motyw:
I dodał do tego tę linię
PreferenceThemeOverlay został już zdefiniowany, nie musiałem go uwzględniać. Działało na moich własnych urządzeniach z Androidem 4.xi 5.x.
źródło
Dodaj ten kod do pliku styles.xml i odpowiednio go zmodyfikuj. Powinno działać dobrze.
źródło
Dodałem element „preferenceTheme” do mojego stylu i wydawało się, że rozwiązało to problem:
źródło
Najbardziej pomocna strona dla mnie: Medium
Autor pokazuje, że musimy dodać dwa pakiety:
com.android.support:preference-v7
icom.android.support:preference-v14
, ponieważ pierwszy jest rozprowadzany bez stylów.Daj znać czy działa
źródło
Zaakceptowany „Takisoft Fix” wydaje się raczej niezdarny i po zabawie z nim nadal nie jestem zadowolony z uzyskanego wyglądu.
Jeśli potrzebujesz
PreferenceFragment
biblioteki obsługi API 9+ , polecam skorzystanie z biblioteki obsługi preferencji materiałów . Działa idealnie (przynajmniej dla mnie).źródło
Ten problem występuje, ponieważ AAPT (Android Asset Packaging Tool) nie może znaleźć niektórych zasobów. Rozwiąż ten problem w następujący sposób:
1. Skopiuj zasoby, które są niezbędne do nowego odpowiadającego folderu zasobów, nazwanego jak res_fw_v7_preference lub innego.
2. Użycie gradle do zbudowania aplikacji i dodanie kilku dodatkowych opcji AAPT do build.gradle (modułów) w następujący sposób:
Mam nadzieję, że to jest pomocne :)
źródło
Dzięki @sergio za odpowiedź, używanie
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
zamiast<item name="preferenceTheme">@style/Preference</item>
działa świetnie dla mnie.źródło
Po prostu odpuść i użyj API 11+.
API 7 ma już prawie siedem lat.
źródło