Nous aurons pour SRDice 2 écrans : un pour les Tests Simples, un second pour les Tests Étendus. Après avoir étudié le développement de la méthode pour lancer une activity depuis une autre (et donc d’un écran à un autre) dans une application Android, je me suis posé la question de mutualiser certaines choses dans le code Java.
Dans un premier temps j’ai vu à mutualiser du code des Activity : On crée une class étendant Activity dans laquelle on met le code partagé entre chaque activity puis on déclare les activity correspondant aux écrans en étendant notre classe :
SRDiceActivity contiendra toutes les méthodes communes aux deux activity:
public class SRDiceActivity extends Activity
SRDSimpleActivity contient le code pour la gestion des tests simples (le SRDice version 1) :
public class SRDSimpleActivity extends SRDiceActivity
SRDExtendedActivity contient le code pour la gestion des tests étendus (la nouveauté SRDice version 2) :
public class SRDExtendedActivity extends SRDiceActivity
Avant toutes choses, un point à ne pas oublier est de déclarer dans le AndroidManifest les Activity qui servent en tant que tel : SRDSimpleActivity et SRDExtendedActivity. SRDiceActivity n’en est pas une.
Dans un premier temps, j’ai saucissonné mon code de façon à ce que le SRDice V1 fonctionne sans changement. Il a fallu d’abord réfléchir à ce qui allait rester dans SRDSimpleActivity et ce qui allait partir dans SRDiceActivity.
Petite liste des méthodes/fonctionnalités communes qui trouvent leur place donc uniquement dans SRDiceActivity :
- Le menu et les actions liées
- Les préférences (gestion et récupération)
- Les actions pour vérifier la présence de la SDCard (cf. Étape 1 du billet sur les logs)
- La récupération, l’enregistrement et la vidange des logs
- L’accès à la base de donnée SQLite et les méthodes de mise à jour de la base de donnée pour les statistiques
- Des fonctions diverses comme la fermeture du clavier virtuel, la récupération de la date courante, la vérification du nombre de dés
- La fonction de lancement des Dés
- L’affichage des boites de dialog génériques.
Dans SRDSimpleActivity:
- La définition de la vue liée avec setContentView(R.layout.srd_simple)
- Les écouteurs des boutons de la vue srd_simple liée à SRDSimpleActivity
- L’affichage de la boite de dialog de Résultat
Comme on peut le voir, l’Affichage des boites de dialog se retrouve dans les deux listes !
Du coup j’ai créé le onCreateDialog à la fois dans SRDiceActivity (avec les gestion des cas qui seront communs) et dans SRDSimpleActivity (avec la gestion du cas particulier du Résultat). Arrivé à ce point se pose la question de comment faire pour que ça marche dans tous les cas !
Tout d’abord, il faut bien avoir conscience que puisque le Dialog est appelé depuis SRDSimpleActivity, c’est donc le onCreateDialog de SRDSimpleActivity qui va être appelé. Mais du coup comment faire pour que les boites de dialog génériques fonctionnent aussi ?
Un point à ne pas oublier en Programmation Orienté Objet (POO) comme Java que l’on peut appeler une méthode de la classe parente même si cette méthode existe (donc avec le même nom) dans la classe fille. C’est pour cela que mon onCreateDialog dans SRDSimpleActivity est ainsi :
protected Dialog onCreateDialog(int id, final Bundle bundle) { if(id == DIALOG_RESULT) { //Traitements propres à la boite dialog DIALOG_RESULT return dialog; } else { return super.onCreateDialog(id, bundle); } }
En Java, on utilise « super » pour désigner la classe mère, soit ici dans le else on a l’appel de la méthode onCreateDialog de SRDiceActivity.
Maintenant que les fonctionnalités de SRDice V1 sont OK, il faut voir à mutualiser les layouts, ce qui fera l’objet du billet suivant !
[…] avoir mutualisé le code Java, il est temps de se pencher les éléments visuels composant les vues : les […]