Catégories

Twitter @CyolFalcon

Je les lis (et ils le valent bien!)

Dév Android SRDice : Ecouteurs d’une série de boutons

Logo application SRDiceUne fonctionnalité que j’avais dans mes tablettes depuis un moment pour SRDice, mon application Android de lancer de Dés pour Shadowrun, était l’ajout de boutons « Quickrolls » : une série de boutons sous le bouton « Lancer » qui seraient des raccourcis pour lancer des tailles de Réserve de dés les plus utilisées. Cette série de bouton étant affecté uniquement aux Tests Simples qui sont plus susceptibles de servir pour de multiples lancers successifs avec des réserves de tailles différentes.

Cela faisait un moment que je ne m’étais pas penché sur SRDice. Non pas que je ne l’utilisais pas, bien au contraire. C’était plutôt que les fonctionnalités implémentées répondaient à mes besoins et que je n’avais pas tant de motivations que ça à prioriser ce projet plutôt que mes autres occupations.

Et puis il y a eu ce duel du personnage d’un de mes joueurs par forum contre un PNJ. J’ai eu l’occasion de retrouver ce joueur le temps d’un midi et nous avons fait le combat en utilisant l’application. Ce qui a donné une utilisation plus intensive qu’à l’habitude et m’a vraiment montré l’intérêt de m’atteler au développement des boutons « Quickrolls ».

Je me retrouve donc avec une douzaine de boutons dans l’interface et avec le fait de leur déclarer un Listener à chacun. Plutôt que bêtement déclarer 12 Listener, j’ai voulu utiliser une boucle for :

Button[] quickroll = new Button[12];
for(int i = 1; i < quickroll.length; i++){
	quickroll[i] = (Button) findViewById(R.id."quickroll" + i);
	quickroll[i].setOnClickListener(new View.OnClickListener() {
		public void onClick(View v) {
		// on place la valeur dans le champ et on lance les dés
			_buttonQuickrollAction(i);
		}
	});
}

Le code ci-dessus est faux. Ce fut un premier jet, qui ne marcha évidemment pas pour plusieurs raisons :
Déjà d’une : quand on déclare un tableau, l’index commence à 0, hors dans ma boucle j’utilisais un indicateur i qui commençait à 1. Forcément j’avais un différentiel… Une erreur de débutant que j’ai vite analysé.
Ensuite, de deux : on ne peut utiliser l’indicateur i en tant qu’élément dans la fonction définie dans le setOnClickListener. Eclipse nous indique bien vite que cette variable doit être déclarée en final si on veut faire ça.
Enfin, de trois : Impossible de récupérer un findViewById de façon dynamique tel que fait ci-dessus.

Il faut en fait dans un premier temps récupérer l’id numérique que Java affecte pour l’élément de la vue et dans un deuxième temps utiliser cet id numérique en argument du findViewById. Pour récupérer l’id numérique affecté par Java, on va utiliser getResources().getIdentifier(**Argument**) **Argument** peut avoir deux formes:

  • getResources().getIdentifier(« fr.cyol.android.testproject:id/quickroll »+i, null, null)
  • getResources().getIdentifier(« quickroll »+i, « id », getPackageName())

Dans le premier cas, on donne en brut l’indication de où trouver la ressource et son type. Dans le second cas on donne en 1er argument le nom de la ressource qu’on cherche, ensuite son type (je recherchais ici un id, mais si j’avais cherché une image j’aurais pu appeler drawable, …) et enfin le nom du package où trouver l’information. Ce qui, au final, après les correctifs et quelques améliorations, nous donne ça :

//Ecouteurs des QuickRolls button
Button[] quickroll = new Button[12];
for(int i = 0; i < quickroll.length; i++){
	final int d=i+1;
	int idButton = getResources().getIdentifier("quickroll" + d, "id", getPackageName());
	quickroll[i] = (Button) findViewById(idButton);
	quickroll[i].setOnClickListener(new View.OnClickListener() {
		public void onClick(View v) {
		// on place la valeur dans le champ et on lance les dés
			_buttonQuickrollAction(d);
		}
	});
}

Et voilà, une nouvelle version de SRDice, la 2.2 voit le jour.

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.