{"id":21,"date":"2013-02-27T20:49:00","date_gmt":"2013-02-27T20:49:00","guid":{"rendered":"http:\/\/cyol.fr\/blogwp\/?p=21"},"modified":"2013-11-14T16:17:59","modified_gmt":"2013-11-14T15:17:59","slug":"dev-android-srdice-ecouteurs-d-une-serie-de-boutons","status":"publish","type":"post","link":"https:\/\/cyol.fr\/blog\/post\/dev-android-srdice-ecouteurs-d-une-serie-de-boutons\/","title":{"rendered":"D\u00e9v Android SRDice : Ecouteurs d&rsquo;une s\u00e9rie de boutons"},"content":{"rendered":"<p><a href=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/srdice.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-108\" title=\"srdice\" alt=\"Logo application SRDice\" src=\"https:\/\/cyol.fr\/blog\/wp-content\/uploads\/billets\/icones\/srdice.png\" width=\"100\" height=\"100\" \/><\/a>Une fonctionnalit\u00e9 que j&rsquo;avais dans mes tablettes depuis un moment pour SRDice, mon application Android de lancer de D\u00e9s pour Shadowrun, \u00e9tait l&rsquo;ajout de boutons \u00ab\u00a0Quickrolls\u00a0\u00bb : une s\u00e9rie de boutons sous le bouton \u00ab\u00a0Lancer\u00a0\u00bb qui seraient des raccourcis pour lancer des tailles de R\u00e9serve de d\u00e9s les plus utilis\u00e9es. Cette s\u00e9rie de bouton \u00e9tant affect\u00e9 uniquement aux Tests Simples qui sont plus susceptibles de servir pour de multiples lancers successifs avec des r\u00e9serves de tailles diff\u00e9rentes.<!--more--><\/p>\n<p>Cela faisait un moment que je ne m&rsquo;\u00e9tais pas pench\u00e9 sur SRDice. Non pas que je ne l&rsquo;utilisais pas, bien au contraire. C&rsquo;\u00e9tait plut\u00f4t que les fonctionnalit\u00e9s impl\u00e9ment\u00e9es r\u00e9pondaient \u00e0 mes besoins et que je n&rsquo;avais pas tant de motivations que \u00e7a \u00e0 prioriser ce projet plut\u00f4t que mes autres occupations.<\/p>\n<p>Et puis il y a eu ce duel du personnage d&rsquo;un de mes joueurs par forum contre un PNJ. J&rsquo;ai eu l&rsquo;occasion de retrouver ce joueur le temps d&rsquo;un midi et nous avons fait le combat en utilisant l&rsquo;application. Ce qui a donn\u00e9 une utilisation plus intensive qu&rsquo;\u00e0 l&rsquo;habitude et m&rsquo;a vraiment montr\u00e9 l&rsquo;int\u00e9r\u00eat de m&rsquo;atteler au d\u00e9veloppement des boutons \u00ab\u00a0Quickrolls\u00a0\u00bb.<\/p>\n<p>Je me retrouve donc avec une douzaine de boutons dans l&rsquo;interface et avec le fait de leur d\u00e9clarer un Listener \u00e0 chacun. Plut\u00f4t que b\u00eatement d\u00e9clarer 12 Listener, j&rsquo;ai voulu utiliser une boucle for :<\/p>\n<pre class=\"brush:java\">Button[] quickroll = new Button[12];\r\nfor(int i = 1; i &lt; quickroll.length; i++){\r\n\tquickroll[i] = (Button) findViewById(R.id.\"quickroll\" + i);\r\n\tquickroll[i].setOnClickListener(new View.OnClickListener() {\r\n\t\tpublic void onClick(View v) {\r\n\t\t\/\/ on place la valeur dans le champ et on lance les d\u00e9s\r\n\t\t\t_buttonQuickrollAction(i);\r\n\t\t}\r\n\t});\r\n}<\/pre>\n<p>Le code ci-dessus est faux. Ce fut un premier jet, qui ne marcha \u00e9videmment pas pour plusieurs raisons :<br \/>\nD\u00e9j\u00e0 d&rsquo;une : quand on d\u00e9clare un tableau, l&rsquo;index commence \u00e0 0, hors dans ma boucle j&rsquo;utilisais un indicateur i qui commen\u00e7ait \u00e0 1. Forc\u00e9ment j&rsquo;avais un diff\u00e9rentiel&#8230; Une erreur de d\u00e9butant que j&rsquo;ai vite analys\u00e9.<br \/>\nEnsuite, de deux : on ne peut utiliser l&rsquo;indicateur i en tant qu&rsquo;\u00e9l\u00e9ment dans la fonction d\u00e9finie dans le setOnClickListener. Eclipse nous indique bien vite que cette variable doit \u00eatre d\u00e9clar\u00e9e en final si on veut faire \u00e7a.<br \/>\nEnfin, de trois : Impossible de r\u00e9cup\u00e9rer un findViewById de fa\u00e7on dynamique tel que fait ci-dessus.<\/p>\n<p>Il faut en fait dans un premier temps r\u00e9cup\u00e9rer l&rsquo;id num\u00e9rique que Java affecte pour l&rsquo;\u00e9l\u00e9ment de la vue et dans un deuxi\u00e8me temps utiliser cet id num\u00e9rique en argument du findViewById. Pour r\u00e9cup\u00e9rer l&rsquo;id num\u00e9rique affect\u00e9 par Java, on va utiliser getResources().getIdentifier(**<em>Argument<\/em>**) **<em>Argument<\/em>** peut avoir deux formes:<\/p>\n<ul>\n<li>getResources().getIdentifier(\u00ab\u00a0fr.cyol.android.testproject:id\/quickroll\u00a0\u00bb+i, null, null)<\/li>\n<li>getResources().getIdentifier(\u00ab\u00a0quickroll\u00a0\u00bb+i, \u00ab\u00a0id\u00a0\u00bb, getPackageName())<\/li>\n<\/ul>\n<p>Dans le premier cas, on donne en brut l&rsquo;indication de o\u00f9 trouver la ressource et son type. Dans le second cas on donne en 1er argument le nom de la ressource qu&rsquo;on cherche, ensuite son type (je recherchais ici un id, mais si j&rsquo;avais cherch\u00e9 une image j&rsquo;aurais pu appeler drawable, &#8230;) et enfin le nom du package o\u00f9 trouver l&rsquo;information. Ce qui, au final, apr\u00e8s les correctifs et quelques am\u00e9liorations, nous donne \u00e7a :<\/p>\n<pre class=\"brush:java\">\/\/Ecouteurs des QuickRolls button\r\nButton[] quickroll = new Button[12];\r\nfor(int i = 0; i &lt; quickroll.length; i++){\r\n\tfinal int d=i+1;\r\n\tint idButton = getResources().getIdentifier(\"quickroll\" + d, \"id\", getPackageName());\r\n\tquickroll[i] = (Button) findViewById(idButton);\r\n\tquickroll[i].setOnClickListener(new View.OnClickListener() {\r\n\t\tpublic void onClick(View v) {\r\n\t\t\/\/ on place la valeur dans le champ et on lance les d\u00e9s\r\n\t\t\t_buttonQuickrollAction(d);\r\n\t\t}\r\n\t});\r\n}<\/pre>\n<p>Et voil\u00e0, une nouvelle version de SRDice, la 2.2 voit le jour.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une fonctionnalit\u00e9 que j&rsquo;avais dans mes tablettes depuis un moment pour SRDice, mon application Android de lancer de D\u00e9s pour Shadowrun, \u00e9tait l&rsquo;ajout de boutons \u00ab\u00a0Quickrolls\u00a0\u00bb : une s\u00e9rie de boutons sous le bouton \u00ab\u00a0Lancer\u00a0\u00bb qui seraient des raccourcis pour lancer des tailles de R\u00e9serve de d\u00e9s les plus utilis\u00e9es. Cette s\u00e9rie de bouton \u00e9tant affect\u00e9 uniquement aux Tests Simples qui sont plus susceptibles de servir pour de multiples lancers successifs avec des r\u00e9serves de tailles diff\u00e9rentes. Cela faisait un moment que je ne m&rsquo;\u00e9tais pas pench\u00e9 sur SRDice. [&#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":[114,15,62,35,22,18,19,112,31],"class_list":["post-21","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-developpement","category-srdice","tag-android","tag-des","tag-developpement-2","tag-eclipse","tag-forum","tag-java","tag-shadowrun","tag-srdice","tag-tests-simples","odd"],"_links":{"self":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/21","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=21"}],"version-history":[{"count":8,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":165,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions\/165"}],"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=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}