Pour créer un écran de configuration et gérer les préférences pour mon SRDice, je suis tombé sur un très bon tutoriel en français :
http://www.ace-art.fr/wordpress/2010/07/20/tutoriel-android-partie-5-les-ecrans-de-preferences/
Et les informations complémentaires sur le site de référence Android :
http://developer.android.com/reference/android/content/SharedPreferences.html
Mise en place :
On utilise une nouvelle classe dérivée de PreferenceActivity :
public class PreferenceWithHeaders extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } }
Création d’un XML des préférences : Pour l’instant je n’en ai qu’une seule : le nombre de dés par défaut
|_res | |_xml | | |_preferences.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="@string/categorie_defaut"> <EditTextPreference android:key="defaultPoolSize" android:title="@string/default_pool_size" android:summary="@string/text_default_pool_size" android:inputType="number" /> </PreferenceCategory> </PreferenceScreen>
Enfin, l’appel à cette nouvelle classe : déclenchée au clic sur le bouton menu_preferences du menu
public boolean onMenuItemSelected (int featureId, MenuItem item) { switch(item.getItemId()){ case R.id.menu_preferences: startActivityForResult(new Intent(this,SRDPreferencesActivity.class), CODE_RETOUR); return true; break; } }
Comme beaucoup de chose dans le développement pour Android, une fois que les bases sont posées, ça fonctionne quasi tout seul. Mais après on peut toujours rajouter des fioritures pour rendre le fonctionnement plus complet et ergonomique. Par exemple, signaler à l’utilisateur que ses préférences sont enregistrée dès qu’il quitte l’écran de préférence.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == CODE_RETOUR) { //appel d'un toast Toast.makeText(this, getResources().getText(R.string.pref_saved), Toast.LENGTH_SHORT).show(); } }
J’y ai aussi appelé ma fonction de vérification du total de dés afin qu’on ne puisse enregistrer dans les préférences plus de 99 dés ou moins de 1. 99 étant donné complètement arbitrairement, peu de chance, même à Shadowrun, qu’un test doivent se faire avec autant de Dés.
Techniquement, je n’ai pas trouvé comment l’appeler avant l’enregistrement des préférences, du coup j’ai fais la vérification après cet enregistrement et j’ai mis à jour les préférences si besoin.
De plus, lors du lancement de l’application, je vais chercher dans les préférences la valeur par défaut qui y est enregistré pour remplir le champ Nombre de dés.
Utiliser les données en préférence :
Pour atteindre les préférences depuis les autres activity on utilise un objet de type SharedPreferences ;
SharedPreferences preferences = getPreferences();
Puis on récupère les éléments par les méthodes get : String, Class, Float, Int, …
Pour les exemple, je considère du String :
preferences.getString("clé de la préférence", "valeur par défaut si la préférence n'est pas renseignée");
On peut aussi modifier les préférences :
preferences.edit().putString("clé de la préférence", "valeur à affecter").commit();
Le .edit() permet l’édition : il crée une nouvelle instance de préférence. C’est le .commit() qui va mettre à jour les préférences avec les modifications qui ont été appliqués sur le .edit().
Problématique à étudier :
Je vois sur l’utilisation mémoire que même fermée, l’application présente des données et du cache. Si je vide le cache par le biais des paramètres de l’Android, ça n’a aucune incidence sur l’application (on ne perd pas le paramétrage de l’application) Logiquement, le cache pourrait être vidé à la fermeture de l’application, point à étudier… Est-ce lié aux préférences ou pas ? Je n’ai pas fait cette vérification d’utilisation de la mémoire avant… Heureusement, j’ai toutes mes versions, je vais pouvoir tester.
[…] et la restitution d’information. Un premier pas dans ce sens avait été franchi avec la mise en place des préférences, même si Android propose justement sur ce point un fonctionnement léger et surtout […]