@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:
import android.annotation.TargetApi;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
public class MyPrefsActivity extends PreferenceActivity
{
private static int prefs=R.xml.myprefs;
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
try {
getClass().getMethod("getFragmentManager");
AddResourceApi11AndGreater();
} catch (NoSuchMethodException e) { //Api < 11
AddResourceApiLessThan11();
}
}
@SuppressWarnings("deprecation")
protected void AddResourceApiLessThan11()
{
addPreferencesFromResource(prefs);
}
@TargetApi(11)
protected void AddResourceApi11AndGreater()
{
getFragmentManager().beginTransaction().replace(android.R.id.content,
new PF()).commit();
}
@TargetApi(11)
public static class PF extends PreferenceFragment
{
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(MyPrefsActivity.prefs); //outer class
// private members seem to be visible for inner class, and
// making it static made things so much easier
}
}
}
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!