PreferenceFragment
ne fonctionnera pas sur 2.2 et 2.3 (uniquement l'API de niveau 11 et ci-dessus). Si vous voulez offrir la meilleure expérience d'utilisateur et de toujours prendre en charge les anciennes versions d'Android, la meilleure pratique semble être ici de mettre en œuvre deux PreferenceActivity
des classes et de décider au moment de l'exécution qui l'invoque. Cependant, cette méthode inclut toujours l'appel Api obsolète, mais vous ne pouvez pas l'éviter.
Ainsi, par exemple, vous avez un preference_headers.xml
:
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
<header android:fragment="your.package.PrefsFragment"
android:title="...">
<extra android:name="resource" android:value="preferences" />
</header>
</preference-headers>
et un écart - preferences.xml
(ce qui n'a pas beaucoup changé depuis le bas de l'API de niveau):
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="...">
...
</PreferenceScreen>
Ensuite, vous avez besoin d'une mise en œuvre de l' PreferenceFragment
:
public static class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
Et enfin, vous avez besoin de deux implémentations de l' PreferenceActivity
, pour les API niveaux supportant ou non PreferenceFragments
:
public class PreferencesActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
addPreferencesFromResource(R.xml.other);
}
}
et:
public class OtherPreferencesActivity extends PreferenceActivity {
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
}
Au point où vous souhaitez afficher l'écran de préférences de l'utilisateur, à vous de décider lequel commencer:
if (Build.VERSION.SDK_INT < 11) {
startActivity(new Intent(this, PreferencesActivity.class));
} else {
startActivity(new Intent(this, OtherPreferencesActivity.class));
}
Donc, fondamentalement, vous avez un fichier xml par fragment, vous charge de chacun de ces fichiers xml manuellement pour API niveaux < 11, et les deux utilisent les mêmes préférences.