Catégories

Je les lis (et ils le valent bien!)

SRDice Préférence sur les logs

Logo AndroidEncore une fois, après le problème sur le bouton relancer, je me trouve face à un développement Android qui semblait une fois de plus super facile et sans surprise à implémenter pour SRDice.
La fonctionnalité en question est d’avoir dans les préférences un choix sur la méthode de log proposant 3 possibilités : Logguer tout le temps, demander à chaque fois (comportement par défaut), ou ne pas logguer.

Ensuite, l’affichage du bouton « Enregistrer » sur le Dialog de résultat dépend de ce choix. Et là problème : à moins de relancer l’application, ce choix n’est pas pris en compte…

… L’explication est assez rapidement trouvée, depuis le temps que je me heurte sur les subtilités des Dialogs (Le bouton Relancer, les problèmes de persistance du contenu, …), je commence à les connaître :

Ayant conditionné l’apparition du bouton dans le onCreateDialog avec la préférence de logging, on ne repasse pas dans le onCreateDialog par la suite et du coup on réutilise la même instance du Dialog. Instance utilise donc le paramétrage de logging en place lors de la première apparition du Dialog.

La solution est donc d’effectuer une action pour soit a/ mettre à jour l’instance de Dialog actuel soit b/ détruire l’instance de Dialog actuel au moment où on sort des préférences. Ou (idée venue après coup mais qui semble encore plus propre que la a/) c/cacher le bouton « Enregistrer » dans le onPrepareDialog s’il n’est pas nécessaire.

Ou comment sauter trop vite aux conclusions, 1ère partie

Je définie logging dans le onCreate de l’activity grâce à la préférence et c’est la variable que j’utilise après pour faire mes vérifications. Hors j’ai oublié de mettre à jour cette variable après l’enregistrement des préférences… Malgré ceci, ça ne marche pas. Bon, mon hypothèse de base était quand même bonne. Ou pas…

Ou comment sauter trop vite aux conclusions, 2ème partie

Autre possibilité, ma vérification se fait sur if(logging== »ask ») mais logging est il un String ?

=> if ((String)logging == (String) »ask ») me renvoie false…

Huhu, la question était mauvaise ! C’est un problème de Java tout bête. Je n’aurais pas du me demander si logging est un String mais plutôt « comment on compare des Strings en Java ».

Autant en PhP on peut comparer deux éléments avec == même si ce sont des strings, autant en Java, il faut utiliser logging.equals(« ask »). Faute idiote d’inattention.

Résolution

Bon maintenant que ces deux petits points sont réglés, je me penche à nouveau sur la question du Dialog. Même après ces deux micro-corrections, le problème reste le même. Mon hypothèse de base était décidément bonne quoi qu’incomplète.

Pour le résoudre, la solution consiste à déclarer le bouton dans le onCreateDialog et après de varier dans le onPrepareDialog sur la visibilité du bouton, voici le code :

@Override
protected void onPrepareDialog(int id, Dialog dialog, final Bundle bundle) {
	switch (id) {
	case DIALOG_RESULT:
		//Carte SD présente et préférence "On pose la question" pour le logging if (mExternalStorageWriteable == true && logging.equals("ask")) {
			//On affiche le bouton ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setVisibility(View.VISIBLE);
			// On a une carte SD, on peut proposer d'enregistrer le log
			((AlertDialog) dialog).setButton(DialogInterface.BUTTON_POSITIVE, res.getString(R.string.logResult), new DialogInterface.OnClickListener() {
				// Définit action pour le Log
				// => enregistre dans les logs, le dialog se ferme
				public void onClick(DialogInterface dialog, int id) {
					_saveResult(bundle);
				}
			});
		}
		else
		{
			//On cache le bouton ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setVisibility(View.GONE);
		}
	}
}

Pour cacher le bouton j’utilise View.GONE plutôt que View.INVISIBLE car le second garde la place pour le bouton, du coup, il y a comme un trou dans l’interface.

Il ne faudra pas que j’oublie de déclencher l’enregistrement automatique si logging.equals(« all ») !

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.