{"id":13,"date":"2012-06-12T18:31:00","date_gmt":"2012-06-12T18:31:00","guid":{"rendered":"http:\/\/cyol.fr\/blogwp\/?p=13"},"modified":"2013-11-14T16:23:20","modified_gmt":"2013-11-14T15:23:20","slug":"srdice-nouvelle-fonctionnalite-bouton-relancer","status":"publish","type":"post","link":"https:\/\/cyol.fr\/blog\/post\/srdice-nouvelle-fonctionnalite-bouton-relancer\/","title":{"rendered":"SRDice nouvelle fonctionnalit\u00e9 : bouton \u00ab\u00a0Relancer\u00a0\u00bb"},"content":{"rendered":"<p>Une fonctionnalit\u00e9 qu&rsquo;on m&rsquo;a demand\u00e9 pour SRDice (et qui est devenu une \u00e9vidence d\u00e8s qu&rsquo;on me l&rsquo;a pr\u00e9sent\u00e9) semblait simple \u00e0 impl\u00e9menter. Malheureusement \u00e7a n&rsquo;est pas le cas&#8230;<br \/>\nLa fonctionnalit\u00e9 en question consiste \u00ab\u00a0simplement\u00a0\u00bb \u00e0 avoir un bouton pour \u00ab\u00a0Relancer\u00a0\u00bb sur la fen\u00eatre de dialogue pr\u00e9sentant le r\u00e9sultat d&rsquo;un jet. Le truc qui a l&rsquo;air tout b\u00eate !<\/p>\n<p><!--more--><br \/>\nMise en place qui, je pensais, allait marcher :<\/p>\n<pre class=\"brush:java\">protected void onPrepareDialog(int id, Dialog dialog, final Bundle bundle) {\r\n\tResources res = getResources();\r\n\tswitch (id) {\r\n\tcase DIALOG_RESULT:\r\n\t\t((AlertDialog) dialog).setButton(DialogInterface.BUTTON_NEUTRAL,\r\n\t\t\tres.getString(R.string.throw_dice_again),\r\n\t\t\tnew DialogInterface.OnClickListener() {\r\n\t\t\t\tpublic void onClick(DialogInterface dialog, int id) {\r\n\t\t\t\t\t\/\/ On relance les d\u00e9s et on met \u00e0 jour le message du dialog\r\n\t\t\t\t\tBundle resultatBundle = _throwDices();\r\n\t\t\t\t\tshowDialog(DIALOG_RESULT, resultatBundle);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t((AlertDialog) dialog).setMessage(bundle.getString(\"resultats\"));\r\n\t} }<\/pre>\n<p>_throwDices est \u00e9videmment ma fonction qui renvoie le r\u00e9sultat du lancer de d\u00e9s dans un Bundle<\/p>\n<p>Hors \u00e7a ne marche pas ! Ou plut\u00f4t \u00e7a marche presque ! Visuellement, on voit que le dialog se met \u00e0 jour avec le nouveau r\u00e9sultat mais pour une raison que je n&rsquo;arrive pas \u00e0 isoler, il se ferme dans la foul\u00e9e !<\/p>\n<p>Il s&rsquo;av\u00e8re que les boutons de AlertDialog ont par d\u00e9faut un comportement de fermer le Dialog dans leur onClickListener.<\/p>\n<p>Il faut donc faire un Override de leur onClickListener pour ne pas leur appliquer le leur par d\u00e9faut :<\/p>\n<pre class=\"brush:java\">final AlertDialog d = new AlertDialog.Builder(context)\r\n\t\t\t.setNeutralButton(android.R.string.ok,\r\n\t\t\t      new Dialog.OnClickListener() {\r\n\t\t\t          @Override\r\n\t\t\t          public void onClick(DialogInterface d, int which) {\r\n\t\t\t              \/\/Do nothing here. We override the onclick\r\n\t\t\t          }\r\n\t\t\t      })\r\n\t\t\t.create();\r\n\r\nd.setOnShowListener(new DialogInterface.OnShowListener() {\r\n\t@Override\r\n\tpublic void onShow(DialogInterface dialog) {\r\n\t\tButton b = d.getButton(AlertDialog.BUTTON_NEUTRAL);\r\n\t\tb.setOnClickListener(new View.OnClickListener() {\r\n\t\t  @Override\r\n\t\t  public void onClick(View view) {\r\n\t\t  }\r\n\t\t});\r\n\t}\r\n});<\/pre>\n<p>R\u00e9ponse trouv\u00e9e ici : <a title=\"Android: 'How to prevent dialog closed or remain dialog when button is clicked'\" href=\"http:\/\/stackoverflow.com\/questions\/2620444\/android-how-to-prevent-dialog-closed-or-remain-dialog-when-button-is-clicked\" hreflang=\"en\">http:\/\/stackoverflow.com\/questions\/2620444\/android-how-to-prevent-dialog-closed-or-remain-dialog-when-button-is-clicked<\/a><\/p>\n<p>Et \u00e9videmment, petite surprise, Eclipse me fait des alertes de compilation Java par rapport aux Override&#8230;<\/p>\n<p><em>The method onClick(View) of type new View.OnClickListener(){} must override a superclass method<\/em><\/p>\n<p>Heureusement il ne s&rsquo;agit l\u00e0 que d&rsquo;un mauvais r\u00e9glage d&rsquo;Eclipse : \u00ab\u00a0<strong>The Source of the Problem: <\/strong>The project was written with a Java JDK\u00a0Compiler compliance level of 1.6 but your eclipse setting is 1.5.\u00a0\u00bb (<a title=\"How to solve 'must override superclass'\" href=\"http:\/\/androidcodemonkey.blogspot.fr\/2011\/10\/how-to-solve-must-override-superclass.html\" hreflang=\"en\">http:\/\/androidcodemonkey.blogspot.fr\/2011\/10\/how-to-solve-must-override-superclass.html<\/a>)<\/p>\n<p>On teste et&#8230; \u00e7a marche ! Le Dialog ne se ferme plus au moment du clic sur le bouton ! Par contre&#8230; Il ne fait plus l&rsquo;action de relance et de mise \u00e0 jour du r\u00e9sultat.<\/p>\n<p>Ceci est certainement du \u00e0 la red\u00e9finition du setOnShowListener qui est overrid\u00e9. Est-ce que \u00e7a passe apr\u00e8s le onPrepareDialog ? Test en copiant-collant ce que j&rsquo;avais mis dans le onPrepare dans le override du setOnShowListener.<\/p>\n<p>C&rsquo;est la bonne ! Je supprime ce que j&rsquo;avais mis dans le onPrepareDialog et \u00e7a fonctionne toujours.<\/p>\n<p>Maintenant il s&rsquo;agit de faire le m\u00e9nage pour avoir un code plus clair&#8230;<\/p>\n<p>Je vais pouvoir maintenant m&rsquo;attaquer au d\u00e9veloppement d&rsquo;autres fonctionnalit\u00e9s.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Une fonctionnalit\u00e9 qu&rsquo;on m&rsquo;a demand\u00e9 pour SRDice (et qui est devenu une \u00e9vidence d\u00e8s qu&rsquo;on me l&rsquo;a pr\u00e9sent\u00e9) semblait simple \u00e0 impl\u00e9menter. Malheureusement \u00e7a n&rsquo;est pas le cas&#8230; La fonctionnalit\u00e9 en question consiste \u00ab\u00a0simplement\u00a0\u00bb \u00e0 avoir un bouton pour \u00ab\u00a0Relancer\u00a0\u00bb sur la fen\u00eatre de dialogue pr\u00e9sentant le r\u00e9sultat d&rsquo;un jet. [&#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,34,35,18,112],"class_list":["post-13","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-dialog","tag-eclipse","tag-java","tag-srdice","odd"],"_links":{"self":[{"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/13","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=13"}],"version-history":[{"count":7,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":1084,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/posts\/13\/revisions\/1084"}],"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=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyol.fr\/blog\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}