Właśnie zauważyłem fakt, że metoda addPreferencesFromResource(int preferencesResId)
jest oznaczona jako przestarzała w dokumentacji Androida ( Reference Entry ).
Niestety w opisie metody nie podano żadnej alternatywnej metody.
Której metody należy użyć zamiast tego, aby połączyć plik preferenceScreen.xml z pasującą funkcją PreferenceActivity?
addPreferencesFromResource(int preferencesResId)
. Czy coś brakuje?Odpowiedzi:
W opisie metody nie podano żadnej metody alternatywnej, ponieważ preferowanym podejściem (od poziomu API 11) jest tworzenie instancji obiektów PreferenceFragment w celu załadowania preferencji z pliku zasobów. Zobacz przykładowy kod tutaj: PreferenceActivity
źródło
Aby dodać więcej informacji do poprawnej odpowiedzi powyżej, po przeczytaniu przykładu z Androida-er znalazłem, że możesz łatwo przekonwertować swoją aktywność preferencyjną na fragment preferencji. Jeśli masz następujące działania:
Jedyne zmiany, które musisz wprowadzić, to utworzyć wewnętrzną klasę fragmentu, przenieść
addPreferencesFromResources()
fragment do fragmentu i wywołać fragment z działania, jak poniżej:Mogą istnieć inne subtelności w tworzeniu bardziej złożonych preferencji z fragmentów; jeśli tak, mam nadzieję, że ktoś je tutaj zauważy.
źródło
addPreferencesFromResources()
w ramach PreferenceFragment? Z początkującego wygląda to niepotrzebnie.@Garret Wilson Dziękuję bardzo! Jako noob do kodowania Androida, utknąłem z problemem niezgodności preferencji przez tak wiele godzin i uważam to za tak rozczarowujące, że przestały używać niektórych metod / podejść do nowych, które nie są obsługiwane przez starsze API konieczność korzystania z różnego rodzaju obejść, aby aplikacja działała na wielu różnych urządzeniach. To naprawdę frustrujące!
Twoja klasa jest świetna, ponieważ pozwala ci pracować w nowych interfejsach API z preferencjami, tak jak kiedyś, ale nie jest kompatybilna wstecz. Ponieważ próbuję dotrzeć do szerokiej gamy urządzeń, majstrowałem przy nim trochę, aby działał na urządzeniach w wersji wcześniejszej niż API 11, a także w nowszych interfejsach API:
Testy zakończyły się powodzeniem w dwóch emulatorach (2.2 i 4.2).
Dlaczego mój kod wygląda tak kiepsko:
Nie jestem koderem Androida i nie jestem największym fanem Java.
Aby uniknąć przestarzałego ostrzeżenia i zmusić Eclipse do umożliwienia mi kompilacji, musiałem uciekać się do adnotacji, ale wydają się one wpływać tylko na klasy lub metody, więc musiałem przenieść kod na dwie nowe metody, aby z tego skorzystać.
Nie chciałbym pisać mojego identyfikatora zasobu xml dwa razy za każdym razem, gdy kopiuję i wklejam klasę dla nowej PreferenceActivity, więc utworzyłem nową zmienną do przechowywania tej wartości.
Mam nadzieję, że przyda się to komuś innemu.
PS: Przepraszam za moje opinie, ale kiedy przychodzisz nowy i odnajdujesz takie utrudnienia, nie możesz się powstrzymać od frustracji!
źródło
Moje podejście jest bardzo podobne do podejścia Garreta Wilsona (dzięki, głosowałem za;)
Ponadto zapewnia kompatybilność w dół z systemem Android <3.
Właśnie zrozumiałem, że moje rozwiązanie jest jeszcze bliższe rozwiązaniu Kevina Remo . Jest po prostu odrobinę czystszy (ponieważ nie opiera się na antipatternu „expection” ).
Dla „prawdziwego” (ale bardziej złożonego) przykładu zobacz NusicPreferencesActivity i NusicPreferencesFragment .
źródło
@SuppressLint("NewApi")
- unikaj - bądź bardziej precyzyjny. Czy uruchomiłeś go dla niskich apis? Będzie rzucaćVerifyError
@SuppressLint("NewApi")
po prostu zły styl@SuppressLint("NewApi")
w tej konkretnej sytuacji?@TargetApi(Build.VERSION_CODES.HONEYCOMB)
- nie wszystkie ostrzeżenia dla dowolnego interfejsu API :)Zamiast wyjątków po prostu użyj:
I użyć
tłumić ostrzeżenia.
źródło
Zamiast używać a
PreferenceActivity
do bezpośredniego wczytywania preferencji, użyjAppCompatActivity
lub równoważnego, który ładuje aPreferenceFragmentCompat
który ładuje preferencje. Jest częścią biblioteki wsparcia (obecnie Android Jetpack) i zapewnia zgodność z API 14.W swoim
build.gradle
dodaj zależność dla biblioteki obsługi preferencji:Uwaga: założymy, że masz już utworzone preferencje XML.
Dla swojej aktywności utwórz nową klasę aktywności. Jeśli używasz motywów materiałowych, powinieneś przedłużyć
AppCompatActivity
, ale możesz być elastyczny dzięki temu:Teraz ważna część: utwórz fragment, który ładuje twoje preferencje z XML:
Aby uzyskać więcej informacji, przeczytaj dokumentację dla programistów Androida dla
PreferenceFragmentCompat
.źródło