Utiliser une classe interne comme auditeur
Nous pouvons définir une autre classe qui est imbriquée dans MainActivity et qui peut servir d’objet d’audience (Listing 5-13). Java permet aux classes d'être imbriquées, nous allons donc en tirer parti; Il existe quelques règles à respecter lors de la définition d’une classe interne, et nous en discuterons dès qu’elles deviennent nécessaires.
Listing 5-13. Une classe intérieure dans MainActivity
Cette ligne montre la méthode onCreate en mode plié. Les capacités de pliage de code de AS3 sont très utiles lorsque vous travaillez avec beaucoup de codes; il réduit l'éditeur principal et vous aide à vous concentrerNotre classe interne telle qu'elle se trouve dans MainActivity. Nous l’avons définie comme privée car elle n’a pas besoin d’être visible de l’extérieur de MainActivity. La même chose que notre classe anonyme dans les sections précédentes, cela doit aussi implémenter l'interface View.OnClickListener car nous allons l'utiliser comme écouteur pour les clics sur les boutons
Remarque : Il est possible que des avertissements et des erreurs apparaissent sur AS3 lors de l'ajout du code de gestion des événements. Ce sont très probablement des déclarations d'importation manquantes; Passez simplement votre souris sur les lignes sinueuses et utilisez la solution rapide (Option + Entrée pour macOS | Alt + Entrée pour Windows et Linux). Il faut importer tous les packages nécessaires.
Listing 5-14. Implémentation de ButtonHandler
Overr Nous remplaçons la méthode onClick de View.OnClickListener; lorsque l'on clique sur l'un des trois boutons, cette méthode est appelée, comme dans notre code de classe anonyme des sections précédentes. Le moteur d'exécution remplira le paramètre View avec la référence à l'objet du bouton sur lequel l'utilisateur a cliqué. C’est ce que nous allons utiliser pour identifier le bouton sur lequel on a cliqué avec la classe Android Toast.La méthode getId de l'objet View renvoie une valeur entière qui correspond à l'ID du bouton tel qu'il est défini dans la classe R.class. N'oubliez pas que les fichiers de présentation sont gonflés pendant l'exécution afin de générer les objets Java réels correspondant à l'élément View décrit dans la présentation. Le runtime génère la classe R., que nous pouvons utiliser pour faire référence par programme aux objets définis dans le fichier de présentationNous vérifions simplement si la valeur de view.getId est l’un de nos boutons; dans cette ligne, nous vérifions s’il s’agit bien de R.id.button1Si vous avez cliqué sur button1, nous appelons une méthode appelée show () et lui passons une chaîne. Nous n'avons pas encore défini la méthode show
Listing 5-15. show( ) Method
void show(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
Log.i(getClass().getName(), message); }
Nous affichons un message Toast. Toast fournit une petite rétroaction sous la forme d'une petite fenêtre contextuelle. Il apparaît comme une superposition dans l’activité en cours, et son apparence n’est que pour une certaine durée, de sorte qu’elle ne masque pas l’activité en cours. C’est un moyen discret d’afficher le statutmessagesLa classe Log nous permet de créer des entrées de journal à peu près comme System.out.println, mais il est plus approprié d'utiliser la classe Log pour générer des messages de débogage et de diagnostic. Vous pouvez afficher les entrées de journal créées par la classe Log dans la fenêtre de l'outil Logcat.La méthode show (Listing 5-15) est membre de MainActivity. ButtonHandler a accès aux méthodes (ou variables) définies dans sa classe englobante. Nous aurions pu définir cette méthode dans la classe ButtonHandler, ce qui aurait été bien aussi.
Figure 5-11. Toast message
Complete code for MainActivity is found in Listing 5-16.
Listing 5-16. Complete Code for MainActivity
Utiliser MainActivity comme auditeur
Une autre façon de gérer les événements pour les trois boutons consiste à utiliser la classe MainActivity comme objet écouteur. Nous ne voulons pas changer le fichier principal du programme tel qu’il est actuellement; De cette façon, nous pourrons y faire référence plus tard. Nous pouvons définir une autre classe qui servira de fichier de programme principal; De cette façon, il peut être côte à côte avec le programme principal original dans le même projet. Dans la barre de menus principale, cliquez sur Fichier -Nouveau Classe Java et remplissez-le comme indiqué à la figure 5-13. Vous pouvez également cliquer avec le bouton droit sur le dossier qui contient MainActivity et utiliser le menu contextuel pour ajouter une classe.
Figure 5-12. Créer un nouveau dialogue de classe
Nous nommerons la nouvelle classe MainActivity2. Il étend la même super-classe que le programme principal d'origine. Laissez le champ "interfaces" vide et laissez l'entrée par défaut sur "Package". La visibilité publique et l'absence de modificateurs devraient convenir à notre environnement.Certains avertissements peuvent apparaître dans la fenêtre d'édition du fichier programme nouvellement créé. ils nous avertissent simplement que la nouvelle classe n'est pas enregistrée dans le fichier AndroidManifest (Figure 5-13).
Figure 5-13. MainActivity2
Laissez ceci pour le moment. nous réglerons cela plus tard. Pour le moment, notre nouveau fichier programme ne contient pas tout ce dont il a besoin pour être une classe d'activité appropriée, il ne remplace pas la méthode onCreate et ne contient aucun fichier de présentation associé. Corrigeons cela en fournissant le code manquant.
Listing 5-17. MainActivity2 Program File
Vous devez ajouter la directive implements sur la classe. Cela signifie que leLa classe MainActivity2 doit se comporter comme s’il s’agissait d’un objet OnClickListener. C’est ce que signifie implémenter n’importe quelle interface. Nous sommes essentiellement d'accord avec un certain contrat d'objet selon lequel, quels que soient les comportements de l'interface, nous nous comportons de la même manière.La méthode onCreate contient le même code que celui du programme principal d'origine(MainActivity.java); bien sûr, nous devons toujours ajouter l'instruction setContentView et les enregistrements de vue - nous y reviendrons dans un instant. Vous remarquerez peut-être le décorateur @Nullable sur le paramètre Bundle; cela signifie simplement que l’objet Bundle, dans le cas où il est nul, n’est pas grave et qu’il peut être ignoré en toute sécuritéLa méthode onClick remplacée de l'interface OnClickListener est maintenant implémentée en tant que méthode membre de MainActivity2Il s’agit de la même implémentation de la méthode show que celle que nous avons vue dans MainActivity d’origine.
Listing 5-19. View Registrations
La méthode onCreate de l'exemple de code précédent n'est pas si différente de nos codes de gestion d'événements. La seule différence est que nous utilisons le même objet pour gérer les événements des trois boutons. Aucun des boutons n'a son propre auditeur dédié, comme c'était le cas avec l'utilisation de classes anonymes. Dans cette approche, la logique du programme est routée à l'intérieur de l'objet écouteur (ButtonHandler). package com.example.ted.eventhandling1;
import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Toast;
/** * Created by ted on 06/10/2017.
*/
Listing 5-20. Complete Code for MainActivity2
Pour tester notre code, nous devons apporter une légère modification au fichier AndroidManifest. Pour le moment, la classe d'activité déclarée dans le manifeste est MainActivity, notre fichier de programme principal d'origine. Lorsque le moteur d'exécution Android lance une application, il examine la déclaration d'activité dans le manifeste et exécute ce programme. Nous devons modifier cette entrée pour que le moteur d'exécution Android lance MainActivity2 au lieu de MainActivity.Ouvrez le fichier AndroidManifest.xml à partir de la fenêtre de l'outil de projet. Il devrait être dans App ➤ manifeste
AndroidManifest.xml.
Listing 5-21. Activity Entry in the Manifest File
Cette entrée indique à l'exécution Android le fichier Java correspondant au programme principal ou au fichier de démarrage de l'application. Définissez la valeur de l'élément activity sur «.MainActivity2», comme indiqué dans le Listing 5-13.Maintenant, vous pouvez l'exécuter dans l'émulateur.