{"id":9,"date":"2012-04-03T19:53:00","date_gmt":"2012-04-03T19:53:00","guid":{"rendered":"http:\/\/cyol.fr\/blogwp\/?p=9"},"modified":"2013-11-14T16:29:19","modified_gmt":"2013-11-14T15:29:19","slug":"dev-android-mise-en-place-des-preferences","status":"publish","type":"post","link":"https:\/\/cyol.fr\/blog\/post\/dev-android-mise-en-place-des-preferences\/","title":{"rendered":"D\u00e9v Android : Mise en place des Pr\u00e9f\u00e9rences"},"content":{"rendered":"<p><a href=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/Android_Robot_100.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-124\" title=\"Android_Robot_100\" alt=\"\" src=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/Android_Robot_100.png\" width=\"85\" height=\"100\" \/><\/a>Pour cr\u00e9er un \u00e9cran de configuration et g\u00e9rer les pr\u00e9f\u00e9rences pour mon SRDice, je suis tomb\u00e9 sur un tr\u00e8s bon tutoriel en fran\u00e7ais :<\/p>\n<p><!--more--><\/p>\n<p><a title=\"[Tutoriel Android] Partie 5 : Les \u00e9crans de pr\u00e9f\u00e9rences\" href=\"http:\/\/www.ace-art.fr\/wordpress\/2010\/07\/20\/tutoriel-android-partie-5-les-ecrans-de-preferences\/\" hreflang=\"fr\">http:\/\/www.ace-art.fr\/wordpress\/2010\/07\/20\/tutoriel-android-partie-5-les-ecrans-de-preferences\/<\/a><\/p>\n<p>Et les informations compl\u00e9mentaires sur le site de r\u00e9f\u00e9rence Android :<\/p>\n<p><a title=\"SharedPreferences\" href=\"http:\/\/developer.android.com\/reference\/android\/content\/SharedPreferences.html\" hreflang=\"en\">http:\/\/developer.android.com\/reference\/android\/content\/SharedPreferences.html<\/a><\/p>\n<h3>Mise en place :<\/h3>\n<p>On utilise une nouvelle classe d\u00e9riv\u00e9e de PreferenceActivity :<\/p>\n<pre class=\"brush:java\">public class PreferenceWithHeaders extends PreferenceActivity \r\n{\r\n    @Override protected void onCreate(Bundle savedInstanceState)\r\n    {\r\n        super.onCreate(savedInstanceState);\r\n        addPreferencesFromResource(R.xml.preferences);\r\n    }\r\n}<\/pre>\n<p>Cr\u00e9ation d&rsquo;un XML des pr\u00e9f\u00e9rences : Pour l&rsquo;instant je n&rsquo;en ai qu&rsquo;une seule : le nombre de d\u00e9s par d\u00e9faut<\/p>\n<pre>|_res\r\n|  |_xml\r\n|  |  |_preferences.xml<\/pre>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;PreferenceScreen xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\" &gt;\r\n    &lt;PreferenceCategory android:title=\"@string\/categorie_defaut\"&gt;\r\n        &lt;EditTextPreference \r\n            android:key=\"defaultPoolSize\"\r\n            android:title=\"@string\/default_pool_size\"\r\n            android:summary=\"@string\/text_default_pool_size\"\r\n            android:inputType=\"number\" \/&gt;\r\n    &lt;\/PreferenceCategory&gt;\r\n&lt;\/PreferenceScreen&gt;<\/pre>\n<p>Enfin, l&rsquo;appel \u00e0 cette nouvelle classe : d\u00e9clench\u00e9e au clic sur le bouton menu_preferences du menu<\/p>\n<pre class=\"brush:java\">public boolean onMenuItemSelected (int featureId, MenuItem item)\r\n{\r\n    switch(item.getItemId()){\r\n    \tcase R.id.menu_preferences:\t\r\n    \t    startActivityForResult(new Intent(this,SRDPreferencesActivity.class), CODE_RETOUR);\r\n    \t    return true;\r\n        break;\r\n    }\r\n}<\/pre>\n<p>Comme beaucoup de chose dans le d\u00e9veloppement pour Android, une fois que les bases sont pos\u00e9es, \u00e7a fonctionne quasi tout seul. Mais apr\u00e8s on peut toujours rajouter des fioritures pour rendre le fonctionnement plus complet et ergonomique. Par exemple, signaler \u00e0 l&rsquo;utilisateur que ses pr\u00e9f\u00e9rences sont enregistr\u00e9e d\u00e8s qu&rsquo;il quitte l&rsquo;\u00e9cran de pr\u00e9f\u00e9rence.<\/p>\n<pre class=\"brush:java\">@Override\r\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\r\n\u00a0\u00a0\u00a0 if(requestCode == CODE_RETOUR) {\r\n\u00a0\u00a0\u00a0\u00a0    \/\/appel d'un toast\r\n\tToast.makeText(this, getResources().getText(R.string.pref_saved), Toast.LENGTH_SHORT).show();\r\n\u00a0\u00a0\u00a0 }\r\n}<\/pre>\n<p>J&rsquo;y ai aussi appel\u00e9 ma fonction de v\u00e9rification du total de d\u00e9s afin qu&rsquo;on ne puisse enregistrer dans les pr\u00e9f\u00e9rences plus de 99 d\u00e9s ou moins de 1. 99 \u00e9tant donn\u00e9 compl\u00e8tement arbitrairement, peu de chance, m\u00eame \u00e0 Shadowrun, qu&rsquo;un test doivent se faire avec autant de D\u00e9s.<br \/>\nTechniquement, je n&rsquo;ai pas trouv\u00e9 comment l&rsquo;appeler avant l&rsquo;enregistrement des pr\u00e9f\u00e9rences, du coup j&rsquo;ai fais la v\u00e9rification apr\u00e8s cet enregistrement et j&rsquo;ai mis \u00e0 jour les pr\u00e9f\u00e9rences si besoin.<br \/>\nDe plus, lors du lancement de l&rsquo;application, je vais chercher dans les pr\u00e9f\u00e9rences la valeur par d\u00e9faut qui y est enregistr\u00e9 pour remplir le champ Nombre de d\u00e9s.<\/p>\n<h3>Utiliser les donn\u00e9es en pr\u00e9f\u00e9rence :<\/h3>\n<p>Pour atteindre les pr\u00e9f\u00e9rences depuis les autres activity on utilise un objet de type SharedPreferences ;<\/p>\n<pre class=\"brush:java\">SharedPreferences preferences = getPreferences();<\/pre>\n<p>Puis on r\u00e9cup\u00e8re les \u00e9l\u00e9ments par les m\u00e9thodes get : String, Class, Float, Int, &#8230;<br \/>\nPour les exemple, je consid\u00e8re du String :<\/p>\n<pre class=\"brush:java\">preferences.getString(\"cl\u00e9 de la pr\u00e9f\u00e9rence\", \"valeur par d\u00e9faut si la pr\u00e9f\u00e9rence n'est pas renseign\u00e9e\");<\/pre>\n<p>On peut aussi modifier les pr\u00e9f\u00e9rences :<\/p>\n<pre class=\"brush:java\">preferences.edit().putString(\"cl\u00e9 de la pr\u00e9f\u00e9rence\", \"valeur \u00e0 affecter\").commit();<\/pre>\n<p>Le .edit() permet l&rsquo;\u00e9dition : il cr\u00e9e une nouvelle instance de pr\u00e9f\u00e9rence. C&rsquo;est le .commit() qui va mettre \u00e0 jour les pr\u00e9f\u00e9rences avec les modifications qui ont \u00e9t\u00e9 appliqu\u00e9s sur le .edit().<\/p>\n<h3>Probl\u00e9matique \u00e0 \u00e9tudier :<\/h3>\n<p>Je vois sur l&rsquo;utilisation m\u00e9moire que m\u00eame ferm\u00e9e, l&rsquo;application pr\u00e9sente des <strong>donn\u00e9es<\/strong> et du <strong>cache<\/strong>. Si je vide le cache par le biais des param\u00e8tres de l&rsquo;Android, \u00e7a n&rsquo;a aucune incidence sur l&rsquo;application (on ne perd pas le param\u00e9trage de l&rsquo;application) Logiquement, le cache pourrait \u00eatre vid\u00e9 \u00e0 la fermeture de l&rsquo;application, point \u00e0 \u00e9tudier&#8230; Est-ce li\u00e9 aux pr\u00e9f\u00e9rences ou pas ? Je n&rsquo;ai pas fait cette v\u00e9rification d&rsquo;utilisation de la m\u00e9moire avant&#8230; Heureusement, j&rsquo;ai toutes mes versions, je vais pouvoir tester.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour cr\u00e9er un \u00e9cran de configuration et g\u00e9rer les pr\u00e9f\u00e9rences pour mon SRDice, je suis tomb\u00e9 sur un tr\u00e8s bon tutoriel en fran\u00e7ais : http:\/\/www.ace-art.fr\/wordpress\/2010\/07\/20\/tutoriel-android-partie-5-les-ecrans-de-preferences\/ Et les informations compl\u00e9mentaires sur le site de r\u00e9f\u00e9rence Android : http:\/\/developer. [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":124,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,2,4],"tags":[26,114,15,62,18,47,19,112],"class_list":["post-9","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-developpement","category-srdice","tag-activity","tag-android","tag-des","tag-developpement-2","tag-java","tag-preferences","tag-shadowrun","tag-srdice","odd"],"_links":{"self":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/9","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/comments?post=9"}],"version-history":[{"count":5,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/9\/revisions"}],"predecessor-version":[{"id":1094,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/9\/revisions\/1094"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/media\/124"}],"wp:attachment":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/media?parent=9"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/categories?post=9"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/tags?post=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}