Was verwenden Sie statt "addPreferencesFromResource" in einer PreferenceActivity?

Ich habe gerade bemerkt, dass die Methode addPreferencesFromResource(int preferencesResId) in der Android-Dokumentation ( Referenzeintrag ) markiert markiert ist.

Leider ist in der Beschreibung des Verfahrens keine alternative Methode vorgesehen.

  • Wenn Sie ein Objekt zweimal erstellen, werden unterschiedliche Ergebnisse erzeugt
  • Default-Aktivität definieren (wenn App startet) programmgesteuert
  • Wie man tablayout programmgesteuert scrollt - Android
  • Ist es möglich, die Java 8 Stream API auf Android API <24 zu verwenden?
  • Android - suche Listenansicht?
  • Gib einen Wert von AsyncTask in Android zurück
  • Welche Methode sollte stattdessen verwendet werden, um eine preferenceScreen.xml mit der passenden PreferenceActivity zu verbinden?

  • Wie kann ich MS Visual Studio für Android-Entwicklung verwenden?
  • Hat die Web View auf Android SSL unterstützt?
  • ActionDone imeOption funktioniert nicht auf EditText in Android 2.3
  • Holen Sie sich Anwendungsinformationen vom Paketnamen
  • Akzeptieren eines Zertifikats für HTTPs auf Android
  • Wie man verschiedene android widget für 1.6 und 3.0+ zur Verfügung stellt?
  • 5 Solutions collect form web for “Was verwenden Sie statt "addPreferencesFromResource" in einer PreferenceActivity?”

    Es gibt keine alternative Methode in der Beschreibung des Verfahrens, da der bevorzugte Ansatz (ab API-Ebene 11) darin besteht, PreferenceFragment- Objekte zu instanziieren, um Ihre Einstellungen aus einer Ressourcendatei zu laden. Siehe hierzu den Beispielcode: PreferenceActivity

    Um weitere Informationen zur korrekten Antwort oben hinzuzufügen, nachdem ich ein Beispiel von Android-er gelesen habe, fand ich, dass du deine Präferenzaktivität leicht in ein Präferenzfragment umwandeln kannst. Wenn Sie folgende Aktivitäten haben:

     public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference_screen); } } 

    Die einzigen Änderungen, die Sie machen müssen, besteht darin, eine interne Fragmentklasse zu erstellen, die addPreferencesFromResources() in das Fragment zu verschieben und das Fragment aus der Aktivität aufzurufen:

     public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.my_preference_screen); } } } 

    Es können andere Feinheiten geben, um komplexere Präferenzen aus Fragmenten zu machen. Wenn ja, hoffe ich, dass jemand sie hier anstellt.

    @Garret Wilson Vielen Dank! Als ein Noob zu Android-Codierung, habe ich mit der Präferenzen Inkompatibilitäts-Problem für so viele Stunden stecken, und ich finde es so enttäuschend sie vereitelt die Verwendung von einigen Methoden / Ansätze für neue, die nicht von den älteren APIs so unterstützt werden Um auf alle möglichen Workarounds zurückgreifen zu müssen, um Ihre App in einer Vielzahl von Geräten zu arbeiten. Es ist wirklich frustrierend!

    Ihre Klasse ist großartig, denn es erlaubt Ihnen, in neuen APIs wih Vorlieben zu arbeiten, wie es früher war, aber es ist nicht rückwärts kompatibel. Da ich versuche, eine breite Palette von Geräten zu erreichen, habe ich mit ihm ein bisschen geplant, um es in Pre-API 11-Geräten sowie in neueren APIs zu arbeiten:

     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 } } } 

    Geprüft in zwei Emulatoren (2.2 und 4.2) mit Erfolg.

    Warum mein Code sieht so beschissen:

    Ich bin ein Noob zu Android-Codierung, und ich bin nicht der größte Java-Fan.

    Um die veraltete Warnung zu vermeiden und Eclipse zu zwingen, mich zu kompilieren, musste ich auf Annotationen zurückgreifen, aber diese scheinen nur Klassen oder Methoden zu beeinflussen, also musste ich den Code auf zwei neue Methoden verschieben, um dies zu nutzen.

    Ich würde nicht gerne meine XML-Ressource id zweimal schreiben, wenn ich die Klasse für eine neue PreferenceActivity kopiere und einfügen, also habe ich eine neue Variable erstellt, um diesen Wert zu speichern.

    Ich hoffe, das wird für jemanden nützlich sein.

    PS: Sorry für meine Meinung, aber wenn Sie neu kommen und finden Sie solche Nachteile, können Sie nicht helfen, aber um frustriert zu bekommen!

    Mein Ansatz ist ganz in der Nähe von Garret Wilson (Danke, ich habe dich abgestimmt;)

    Darüber hinaus bietet es Abwärtskompatibilität mit Android <3.

    Ich habe gerade erkannt, dass meine Lösung noch näher an der von Kevin Remo ist . Es ist nur ein bisschen sauberer (da es sich nicht auf die "Expektion" Antipattern ).

     public class MyPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { onCreatePreferenceActivity(); } else { onCreatePreferenceFragment(); } } /** * Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (ie API lvl * < 11). */ @SuppressWarnings("deprecation") private void onCreatePreferenceActivity() { addPreferencesFromResource(R.xml.preferences); } /** * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (ie API lvl >= * 11). */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void onCreatePreferenceFragment() { getFragmentManager().beginTransaction() .replace(android.R.id.content, new MyPreferenceFragment ()) .commit(); } } 

    Für ein "reales" (aber komplexer) Beispiel siehe NusicPreferencesActivity und NusicPreferencesFragment .

    Statt Ausnahmen verwenden Sie einfach:

     if (Build.VERSION.SDK_INT >= 11) 

    Und verwenden

     @SuppressLint("NewApi") 

    Um die Warnungen zu unterdrücken.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.