Comment créer une activité de préférence et un Fragment de préférence sur Android?
comme je suivais un ancien tutoriel ( Créez des applications pour Android -> openclassroom ) j'ai été bloqué sur cette méthode dépréciée addPreferencesFromResource(int id)
de la classe PreferenceActivity.
donc ma question Est:
Quelle est la nouvelle façon de créer des Préférences Dans Android ?
2 réponses
j'ai trouvé ce post ( Que dois-je utiliser au lieu de" addPreferencesFromResource " dans une activité de préférence? ) qui m'aident à comprendre que vous devez passer par un PreferenceFragment
pour le faire.
dans l'explication suivante, j'utilise your.package.
juste pour montrer que vous devez mettre le nom du paquet. Tout le monde a son propre paquet alors veuillez le remplacer par votre paquet.
commençons:
1. Fragment De Préférence
-
créez votre classe de fragment préféré
MyPreferenceFragment
public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.fragment_preference); } }
-
puis la ressource xml associée
fragment_preference.xml (dans le dossier res/xml de votre projet)
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="FOO"> <CheckBoxPreference android:key="checkBoxPref" android:title="check it out" android:summary="click this little box"/> </PreferenceCategory> </PreferenceScreen>
C'est tout pour la partie
Fragment
.
2. Activité De Préférence
-
créer la classe D'activité de préférence
Mypreference activity "1519380920
public class MyPreferenceActivity extends PreferenceActivity { @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.headers_preference, target); } @Override protected boolean isValidFragment(String fragmentName) { return MyPreferenceFragment.class.getName().equals(fragmentName); } }
N'oubliez pas pour outrepasser
isValidFragment(String fragmentName)
méthode que vous allez obtenir frappé au visage par votre application ! ;) Plus sérieusement je n'ai aucune idée pourquoi vous devez faire cela, mais il est nécessaire. Si quelqu'un a une explication à ce sujet, je le lirais volontiers:)EDIT:
merci à kirtan403 I maintenant savoir pourquoi il est nécessaire : elle doit être établie en raison d'une ( android cadre fragment d'injection ).
comme vous pouvez le voir dans le
onBuildHeaders(List<Header> target)
nous chargeons un autre fichier xml qui contient les en-têtes de la préférence. En bref, les en-têtes sont la partie gauche de la préférence et le fragment est la partie droite (pour tablette). Pour un téléphone, vous aurez d'abord les en-têtes et lorsque vous cliquez sur un élément le fragment correspondant sera placé en haut de la liste des en-têtes.Lire cet article ( Multi-volet développement Android avec des Fragments - Tutoriel ) les images expliquent eux-mêmes.
-
puis la ressource xml associée
headers_preference.XML (dans le dossier res/xml de votre projet)
<?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="your.package.MyPreferenceFragment" android:title="Goto: Preference fragment" android:summary="An example of some preferences." /> </preference-headers>
comme vous avez peut-être remarqué dans la section en-tête vous avez:
android:fragment="your.package.MyPreferenceFragment"
ceci servira de lien vers le fragment que vous voulez montrer. Sur la tablette il se chargera sur la partie droite et sur le téléphone il se chargera sur le dessus de la vue actuelle.
3. Androïde Manifeste
maintenant, ce que vous devez faire est d'ajouter votre activité dans le fichier AndroidManifest.xml
.
dans la section application
ajouter ces lignes:
<activity
android:name="your.package.MyPreferenceActivity"
android:label="Preferences">
</activity>
vous me direz probablement:
"Oh darling vous avez oublié de mettre android:launchMode="singleTask" dans votre activity "
mais ne mettez pas ce car vous ne chargerez jamais votre fragment sur le téléphone. Cette erreur a été résolue par un grand homme ! C'est le lien vers son blog ( Android-tête des préférences sur le petit écran de téléphone mobile/ ).
4. Démarrer les préférences à partir du Menu
enfin vous devez ajoutez la possibilité de montrer cette préférence !! Pour ce faire, vous aurez besoin de 3 choses :
-
Le Menu
dans le menu.xml (dans le dossier res/menu de votre projet)
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/preferences" android:title="Preferences" /> </menu>
-
PreferenceActivity) selon la méthode
onCreateOptionsMenu(Menu menu)
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }
-
démarrage de l'activité
MyPreferenceActivity
lorsque vous cliquez sur ce bouton.pour cela, vous devrez outrepasser la méthode
onOptionsItemSelected(MenuItem item)
dans votre activité principale.@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.preferences: { Intent intent = new Intent(); intent.setClassName(this, "your.package.MyPreferenceActivity"); startActivity(intent); return true; } } return super.onOptionsItemSelected(item); }
et voila les amis !
Je n'ai pas testé ce code. Je l'ai pris et modifié à partir de mon propre code pour ne pas avoir bien copié les choses collées. Si vous rencontrez des erreurs dites-moi, je vais essayer de comprendre le problème et le corriger.
j'espère que ce post aidera certaines personnes là-bas :D
santé !
j'ai aimé la solution de ce post: http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment
.. parce qu'elle semble la plus compacte pour quelqu'un qui a juste besoin de quelque chose de très basique et qui fonctionne rapidement. Il n'a qu'un seul .fichier java et deux petits fichiers xml.
Activité Config RAPPELS
après avoir ajouté les 3 fichiers à votre projet, N'oubliez pas de
a) Ajouter L'activité Prefs au Manifeste fichier
B) Ajouter un moyen de lancer L'activité Prefs .. par exemple, un bouton ou un élément de Menu
ajoutez les fichiers suivants à votre projet. Utiliser l'ordre de la liste pour éviter les erreurs de compilation.
-
Ajouter /res/values/matrice.xml
<resources> <string-array name="listArray"> <item>Ace</item> <item>Club</item> </string-array> <string-array name="listValues"> <item>Ace</item> <item>Club</item> </string-array> </resources>
-
Ajouter /res/xml/préférences.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:title="Your Name" android:key="username" android:summary="Please provide your username"></EditTextPreference> <CheckBoxPreference android:title="Application Updates" android:defaultValue="false" android:summary="This option if selected will allow the application to check for latest versions." android:key="applicationUpdates" /> <ListPreference android:title="Download Details" android:summary="Select the kind of data that you would like to download" android:key="downloadType" android:defaultValue="Ace" android:entries="@array/listArray" android:entryValues="@array/listValues" /> </PreferenceScreen>
-
ajouter le code d'activité
public class AppPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); checkValues(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } private void checkValues() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String strUserName = sharedPrefs.getString("username", "NA"); boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false); String downloadType = sharedPrefs.getString("downloadType","1"); String msg = "Cur Values: "; msg += "\n userName = " + strUserName; msg += "\n bAppUpdates = " + bAppUpdates; msg += "\n downloadType = " + downloadType; Toaster.shortDebug(msg); } }