{"id":17,"date":"2012-07-05T19:20:00","date_gmt":"2012-07-05T19:20:00","guid":{"rendered":"http:\/\/cyol.fr\/blogwp\/?p=17"},"modified":"2013-11-14T16:21:14","modified_gmt":"2013-11-14T15:21:14","slug":"dev-android-srdice-mutualisation-du-code-java","status":"publish","type":"post","link":"https:\/\/cyol.fr\/blog\/post\/dev-android-srdice-mutualisation-du-code-java\/","title":{"rendered":"D\u00e9v Android SRDice : Mutualisation du code Java"},"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=\"Logo Android\" src=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/Android_Robot_100.png\" width=\"85\" height=\"100\" \/><\/a>Nous aurons pour SRDice 2 \u00e9crans : un pour les Tests Simples, un second pour les Tests \u00c9tendus. Apr\u00e8s avoir \u00e9tudi\u00e9 le d\u00e9veloppement de la <a title=\"SRDice Tests Etendus 1 : switch entre 2 activity\" href=\"https:\/\/cyol.fr\/blog\/post\/srdice-tests-etendus-1-switch-entre-2-activity\/\">m\u00e9thode pour lancer une activity depuis une autre<\/a> (et donc d&rsquo;un \u00e9cran \u00e0 un autre) dans une application Android, je me suis pos\u00e9 la question de mutualiser certaines choses dans le code Java.<\/p>\n<p><!--more--><br \/>\nDans un premier temps j&rsquo;ai vu \u00e0 mutualiser du code des <a href=\"\/blog\/tag\/Activity\">Activity<\/a> : On cr\u00e9e une class \u00e9tendant Activity dans laquelle on met le code partag\u00e9 entre chaque activity puis on d\u00e9clare les activity correspondant aux \u00e9crans en \u00e9tendant notre classe :<\/p>\n<p>SRDiceActivity contiendra toutes les m\u00e9thodes communes aux deux activity:<\/p>\n<pre class=\"brush:java\">public class SRDiceActivity extends Activity<\/pre>\n<p>SRDSimpleActivity contient le code pour la gestion des tests simples (le SRDice version 1) :<\/p>\n<pre class=\"brush:java\">public class SRDSimpleActivity extends SRDiceActivity<\/pre>\n<p>SRDExtendedActivity contient le code pour la gestion des tests \u00e9tendus (la nouveaut\u00e9 SRDice version 2) :<\/p>\n<pre class=\"brush:java\">public class SRDExtendedActivity extends SRDiceActivity<\/pre>\n<p>Avant toutes choses, un point \u00e0 ne pas oublier est de d\u00e9clarer dans le AndroidManifest les Activity qui servent en tant que tel : SRDSimpleActivity et SRDExtendedActivity. SRDiceActivity n&rsquo;en est pas une.<br \/>\nDans un premier temps, j&rsquo;ai saucissonn\u00e9 mon code de fa\u00e7on \u00e0 ce que le SRDice V1 fonctionne sans changement. Il a fallu d&rsquo;abord r\u00e9fl\u00e9chir \u00e0 ce qui allait rester dans SRDSimpleActivity et ce qui allait partir dans SRDiceActivity.<br \/>\nPetite liste des m\u00e9thodes\/fonctionnalit\u00e9s communes qui trouvent leur place donc uniquement dans SRDiceActivity :<\/p>\n<ul>\n<li>Le menu et les actions li\u00e9es<\/li>\n<li>Les pr\u00e9f\u00e9rences (gestion et r\u00e9cup\u00e9ration)<\/li>\n<li>Les actions pour v\u00e9rifier la pr\u00e9sence de la SDCard (<a title=\"SRDice : Log des lancers de D\u00e9s\" href=\"https:\/\/cyol.fr\/blog\/post\/srdice-log-des-lancers-de-des\/\" hreflang=\"en\">cf. \u00c9tape 1 du billet sur les logs<\/a>)<\/li>\n<li>La <a title=\"SRDice : Log des lancers de D\u00e9s\" href=\"https:\/\/cyol.fr\/blog\/post\/srdice-log-des-lancers-de-des\/\" hreflang=\"en\">r\u00e9cup\u00e9ration, l&rsquo;enregistrement et la vidange des logs<\/a><\/li>\n<li>L&rsquo;acc\u00e8s \u00e0 la <a title=\"SRDice statistiques : stockage sur une base SQLite\" href=\"https:\/\/cyol.fr\/blog\/post\/srdice-statistiques-stockage-sur-une-base-sqlite\/\">base de donn\u00e9e SQLite<\/a> et les m\u00e9thodes de mise \u00e0 jour de la base de donn\u00e9e pour les statistiques<\/li>\n<li>Des fonctions diverses comme la fermeture du clavier virtuel, la <a title=\"D\u00e9v Android : attention \u00e0 l\u2019import de classe Date\" href=\"https:\/\/cyol.fr\/blog\/post\/dev-android-attention-a-l-import-de-classe-date\/\">r\u00e9cup\u00e9ration de la date courante<\/a>, la v\u00e9rification du nombre de d\u00e9s<\/li>\n<li>La fonction de lancement des D\u00e9s<\/li>\n<li>L&rsquo;<a title=\"D\u00e9v Android : les Dialog (probl\u00e8me de persistance du contenu avec onCreateDialog)\" href=\"https:\/\/cyol.fr\/blog\/post\/dev-android-les-dialog-probleme-de-persistance-du-contenu-avec-oncreatedialog\/\">affichage des boites de dialog<\/a> g\u00e9n\u00e9riques.<\/li>\n<\/ul>\n<p>Dans SRDSimpleActivity:<\/p>\n<ul>\n<li>La d\u00e9finition de la vue li\u00e9e avec setContentView(R.layout.srd_simple)<\/li>\n<li>Les \u00e9couteurs des boutons de la vue srd_simple li\u00e9e \u00e0 SRDSimpleActivity<\/li>\n<li>L&rsquo;<a title=\"D\u00e9v Android : les Dialog (probl\u00e8me de persistance du contenu avec onCreateDialog)\" href=\"https:\/\/cyol.fr\/blog\/post\/dev-android-les-dialog-probleme-de-persistance-du-contenu-avec-oncreatedialog\/\">affichage de la boite de dialog<\/a> de R\u00e9sultat<\/li>\n<\/ul>\n<p>Comme on peut le voir, l&rsquo;Affichage des boites de dialog se retrouve dans les deux listes !<\/p>\n<p>Du coup j&rsquo;ai cr\u00e9\u00e9 le onCreateDialog \u00e0 la fois dans SRDiceActivity (avec les gestion des cas qui seront communs) et dans SRDSimpleActivity (avec la gestion du cas particulier du R\u00e9sultat). Arriv\u00e9 \u00e0 ce point se pose la question de comment faire pour que \u00e7a marche dans tous les cas !<\/p>\n<p>Tout d&rsquo;abord, il faut bien avoir conscience que puisque le Dialog est appel\u00e9 depuis SRDSimpleActivity, c&rsquo;est donc le onCreateDialog de SRDSimpleActivity qui va \u00eatre appel\u00e9. Mais du coup comment faire pour que les boites de dialog g\u00e9n\u00e9riques fonctionnent aussi ?<\/p>\n<p>Un point \u00e0 ne pas oublier en Programmation Orient\u00e9 Objet (POO) comme Java que l&rsquo;on peut appeler une m\u00e9thode de la classe parente m\u00eame si cette m\u00e9thode existe (donc avec le m\u00eame nom) dans la classe fille. C&rsquo;est pour cela que mon onCreateDialog dans SRDSimpleActivity est ainsi :<\/p>\n<pre class=\"brush:java\">\tprotected Dialog onCreateDialog(int id, final Bundle bundle) {\r\n\t\tif(id == DIALOG_RESULT)\r\n\t\t{\r\n\t\t\t\/\/Traitements propres \u00e0 la boite dialog DIALOG_RESULT\r\n\t\t\treturn dialog;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn super.onCreateDialog(id, bundle);\r\n\t\t}\r\n\t}<\/pre>\n<p>En Java, on utilise \u00ab\u00a0super\u00a0\u00bb pour d\u00e9signer la classe m\u00e8re, soit ici dans le else on a l&rsquo;appel de la m\u00e9thode onCreateDialog de SRDiceActivity.<\/p>\n<p>Maintenant que les fonctionnalit\u00e9s de SRDice V1 sont OK, il faut voir \u00e0 mutualiser les layouts, ce qui fera l&rsquo;objet du billet suivant !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous aurons pour SRDice 2 \u00e9crans : un pour les Tests Simples, un second pour les Tests \u00c9tendus. Apr\u00e8s avoir \u00e9tudi\u00e9 le d\u00e9veloppement de la m\u00e9thode pour lancer une activity depuis une autre (et donc d&rsquo;un \u00e9cran \u00e0 un autre) dans une application Android, je me suis pos\u00e9 la question de mutualiser certaines choses dans le code Java. Dans un premier temps j&rsquo;ai vu \u00e0 mutualiser du code des Activity : On cr\u00e9e une class \u00e9tendant Activity dans laquelle on met le code partag\u00e9 entre chaque activity puis on d\u00e9clare les activity correspondant aux \u00e9crans en \u00e9tendant notre classe : SRDiceActivity contiendra toutes les m\u00e9thodes communes aux deux activity: public class SRDiceActivity extends Activity SRDSimpleActivity contient le code pour la gestion des tests simples (le SRDice version 1) : public class SRDSimpleActivity extends SRDiceActivity SRDExtendedActivity contient le code pour la gestion des tests \u00e9tendus (la nouveaut\u00e9 SRDice version 2) : public class SRDExtendedActivity extends SRDiceActivity Avant toutes choses, un point \u00e0 ne pas oublier est de d\u00e9clarer dans le AndroidManifest les Activity qui servent en tant que tel : SRDSimpleActivity et SRDExtendedActivity. [&#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,30,15,62,34,18,47,50,36,51,112,32,31],"class_list":["post-17","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-developpement","category-srdice","tag-activity","tag-android","tag-androidmanifest","tag-des","tag-developpement-2","tag-dialog","tag-java","tag-preferences","tag-programmation-oriente-objet","tag-sdcard","tag-sqlite","tag-srdice","tag-tests-etendus","tag-tests-simples","odd"],"_links":{"self":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/17","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=17"}],"version-history":[{"count":5,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/17\/revisions"}],"predecessor-version":[{"id":1081,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/17\/revisions\/1081"}],"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=17"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/categories?post=17"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/tags?post=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}