Catégories

Je les lis (et ils le valent bien!)

SRDice nouvelle fonctionnalité : bouton « Relancer »

Une fonctionnalité qu’on m’a demandé pour SRDice (et qui est devenu une évidence dès qu’on me l’a présenté) semblait simple à implémenter. Malheureusement ça n’est pas le cas…
La fonctionnalité en question consiste « simplement » à avoir un bouton pour « Relancer » sur la fenêtre de dialogue présentant le résultat d’un jet. Le truc qui a l’air tout bête !


Mise en place qui, je pensais, allait marcher :

protected void onPrepareDialog(int id, Dialog dialog, final Bundle bundle) {
	Resources res = getResources();
	switch (id) {
	case DIALOG_RESULT:
		((AlertDialog) dialog).setButton(DialogInterface.BUTTON_NEUTRAL,
			res.getString(R.string.throw_dice_again),
			new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int id) {
					// On relance les dés et on met à jour le message du dialog
					Bundle resultatBundle = _throwDices();
					showDialog(DIALOG_RESULT, resultatBundle);
				}
			});
		((AlertDialog) dialog).setMessage(bundle.getString("resultats"));
	} }

_throwDices est évidemment ma fonction qui renvoie le résultat du lancer de dés dans un Bundle

Hors ça ne marche pas ! Ou plutôt ça marche presque ! Visuellement, on voit que le dialog se met à jour avec le nouveau résultat mais pour une raison que je n’arrive pas à isoler, il se ferme dans la foulée !

Il s’avère que les boutons de AlertDialog ont par défaut un comportement de fermer le Dialog dans leur onClickListener.

Il faut donc faire un Override de leur onClickListener pour ne pas leur appliquer le leur par défaut :

final AlertDialog d = new AlertDialog.Builder(context)
			.setNeutralButton(android.R.string.ok,
			      new Dialog.OnClickListener() {
			          @Override
			          public void onClick(DialogInterface d, int which) {
			              //Do nothing here. We override the onclick
			          }
			      })
			.create();

d.setOnShowListener(new DialogInterface.OnShowListener() {
	@Override
	public void onShow(DialogInterface dialog) {
		Button b = d.getButton(AlertDialog.BUTTON_NEUTRAL);
		b.setOnClickListener(new View.OnClickListener() {
		  @Override
		  public void onClick(View view) {
		  }
		});
	}
});

Réponse trouvée ici : http://stackoverflow.com/questions/2620444/android-how-to-prevent-dialog-closed-or-remain-dialog-when-button-is-clicked

Et évidemment, petite surprise, Eclipse me fait des alertes de compilation Java par rapport aux Override…

The method onClick(View) of type new View.OnClickListener(){} must override a superclass method

Heureusement il ne s’agit là que d’un mauvais réglage d’Eclipse : « The Source of the Problem: The project was written with a Java JDK Compiler compliance level of 1.6 but your eclipse setting is 1.5. » (http://androidcodemonkey.blogspot.fr/2011/10/how-to-solve-must-override-superclass.html)

On teste et… ça marche ! Le Dialog ne se ferme plus au moment du clic sur le bouton ! Par contre… Il ne fait plus l’action de relance et de mise à jour du résultat.

Ceci est certainement du à la redéfinition du setOnShowListener qui est overridé. Est-ce que ça passe après le onPrepareDialog ? Test en copiant-collant ce que j’avais mis dans le onPrepare dans le override du setOnShowListener.

C’est la bonne ! Je supprime ce que j’avais mis dans le onPrepareDialog et ça fonctionne toujours.

Maintenant il s’agit de faire le ménage pour avoir un code plus clair…

Je vais pouvoir maintenant m’attaquer au développement d’autres fonctionnalités.

2 comments to SRDice nouvelle fonctionnalité : bouton « Relancer »

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.