Aperçu de la gestion des événements

Le processus de gestion des événements de manière déclarative peut être décomposé comme suit.

1. Définissez l’objet de vue (par exemple, une vue Bouton). Cela peut être fait en mode design ou en mode texte 

 

  1. <Button
  2.  
  3. android:id="@+id/button"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"
  6. android:layout_marginStart="27dp"
  7. android:layout_marginTop="141dp"
  8. android:onClick="sayHello"
  9. android:tag="mybutton"
  10. android:text="Button"
  11.  
  12. app:layout_constraintStart_toStartOf="parent"
  13. app:layout_constraintTop_toTopOf="parent"
  14.  
  15. tools:layout_editor_absoluteX="27dp"
  16. tools:layout_editor_absoluteY="141dp"/>

2. Choisissez l’événement auquel vous souhaitez que le programme réponde: par exemple, un événement click (certains objets de vue peuvent répondre à une plage d’événements: clic long, glisser,

3. Associez l'événement à une méthode Java: par exemple, ajoutez l'attribut onClick sur l'élément XML de la vue Bouton android: onClick = "sayHello". Sinon, vous pouvez associer un objet de vue à une méthode dans les attributs. inspecteur

4. Implémentez la méthode Java dans le fichier de programme principal (MainActivity.java). Le nom de la méthode doit être identique à celui défini dans l'inspecteur d'attributs.

  1. void sayHello(View v) {
  2.  
  3. System.out.println("Hello");
  4.  
  5. }

Pour gérer les événements par programme, les étapes peuvent être décomposées comme suit.

  1. Définissez l’objet de vue (par exemple, une vue Bouton)
  2. Dans le programme principal, déclarez qu'une variable contient un objet de la vue Bouton

    Button objButton;

  1. Obtenez une référence par programme à l'objet de vue Button défini dans le fichier de présentation objButton = (Button) findViewById (R.layout.button).
  2. Choisissez l’événement auquel vous souhaitez répondre et spécifiez l’objet écouteur correspondant (par exemple, Cliquez).

    objButton.setOnClickListener (new View.OnClickListener () {});

  1. Remplacez la méthode onClick: vous pouvez maintenant implémenter la logique du programme ici. Faites ce que vous voulez faire en réponse à l'action de l'utilisateur
  1. void onClick (Afficher v) {
  2.  
  3. // fait quelque chose ici
  4.  
  5. }

Nous examinerons les deux techniques un peu plus près dans les sections suivantes.  

Gestion des événements déclaratifs

  1. Ouvrez le projet Hello du dernier chapitre, s’il n’est pas encore ouvert. Ouvrez le fichier de mise en page (activity_main) à partir de la fenêtre de l'outil de projet et affichez-le en mode conception.
  2. Select the Button view
  3. While the Button is selected, go to the Attributes inspector and find the onClick attribute
  1. Type the text sayHello as shown in Figure 5-1

 

Figure 5-1. onClick attribute

Listing 5-1. app/src/main/res/layout/activity_main.xml

  1. <Button
  2.  
  3. android:id="@+id/button"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"
  6. android:layout_marginStart="27dp"
  7. android:layout_marginTop="141dp"
  8. android:onClick="sayHello"
  9. android:text="Button"
  10.  
  11. app:layout_constraintStart_toStartOf="parent"
  12. app:layout_constraintTop_toTopOf="parent"
  13.  
  14. tools:layout_editor_absoluteX="27dp"
  15. tools:layout_editor_absoluteY="141dp"/>

Cela a été ajouté automatiquement par AS3 lorsque vous avez écrit sayHello sur l'attribut onClick. La mise à jour fonctionne dans les deux sens: vous auriez pu modifier ce XML directement et la mise à jour aurait été reflétée dans l'inspecteur d'attributs. Lorsque vous exécutez cette application, le moteur d'exécution Android recherche la méthode sayHello dans MainActivity.java; pour le moment, nous ne l’avons pas encore, mais nous allons mettre en œuvre cette méthode dans quelques instants.Remplir l'entrée de l'attribut onClick signifie que vous souhaitez que quelque chose se produise lorsque l'utilisateur clique sur la vue Bouton. l'entrée d'attribut devient le nom d'une méthode que le moteur d'exécution Android recherchera lorsqu'un événement de clic se produit sur le bouton. Pour implémenter la méthode sayHello, ouvrons le fichier MainActivity.java dans l’éditeur principal et écrivez notre méthode.

 

Listing 5-2. sayHello Method

  1. void sayHello(View v) {
  2.  
  3. System.out.println("Hello");
  4.  
  5. }

Conseil

Lorsque vous tapez le code, certains mots clés peuvent sembler ne pas être reconnus. C’est probablement parce que vous n’avez pas encore importé les classes appropriées. AS3 a une fonction de correction rapide (Alt + Entrée ou Option + Entrée). Si vous passez la souris sur le mot clé non reconnu, AS3 importera automatiquement les classes nécessaires pour vous.

La méthode est simple, mais il faut souligner quelques éléments (tableau 5-1). 

Table 5-1. Parts of sayHello method

Item

Code artifact

Comment

Return type

void

Nous n’avons pas besoin de renvoyer quoi que ce soit à notre appelant, ce qui est déclaré nul.

Method name

sayHello()

Cela doit être identique à ce qu'il est écrit dans l'attribut onClick du Button

Arguments or parameters

View object

Chaque gestionnaire d'événement doit accepter un argument d'objet View. Cet argument est rempli par le runtime Android. Si vous avez besoin de savoir quel objet View a été cliqué, vous pouvez utiliser ce paramètre.

 Exécutez l'application dans un AVD afin de voir son comportement et de tester le fonctionnement de notre gestionnaire d'événements. Une fois que l’AVD est opérationnel, ouvrons la fenêtre de l’outil Logcat afin que nous puissions voir un vidage de la console de tous les événements de l’émulateur.Pour lancer la fenêtre de l'outil Logcat, cliquez sur le lanceur «Logcat». il se situe quelque part en bas à gauche de la fenêtre de l'application AS3, comme illustré à la figure 5-2. 

Figure 5-2. Fenêtre Logcat

Allez à l'émulateur et cliquez sur le bouton de notre application. Pendant que vous faites cela, essayez de regarder la fenêtre Logcat (Figure 5-3).

Figure 5-3. System.out on Logcat

La sortie de System.out ne sera pas sur l'activité; au lieu de cela, il est redirigé vers la fenêtre Logcat de la console. 

Gestion d'événements programmatiques 

Il peut être préférable de créer un nouveau projet pour cet exercice afin de pouvoir conserver le dernier projet comme référence. Créez un nouveau projet avec les informations du tableau 5-2. 

Table 5-2. Project information for Hello2

Application name

Hello2

Company domain

Utilisez votre site Web ou inventez quelque chose; rappelez-vous que ceci est en notation DNS inverse

Project location

Cela vaut généralement mieux laissé seul. Utilisez la valeur par défaut, mais veillez à prendre note de cet emplacement au cas où vous auriez à y accéder. Ignorer le support C ++ et Kotlin

Form factor

Téléphone et tablette seulement

Minimum SDK

API 23 guimauve

Type of activity

Vide

Activity name

Si vous laissez la valeur par défaut seule, ce sera MainActivity, ce qui est bien.

Layout name

Si vous laissez la valeur par défaut seule, ce sera activity_main, ce qui est bien

 Comme pour le projet Hello de la dernière section, placez les objets de vue editText, textView et Button dans le fichier de présentation et utilisez simplement les "contraintes d'inférence" pour créer un semblant de conception dans votre projet. Votre fichier de présentation devrait ressembler à la liste 5-2.

 

Listing 5-3. app/src/main/res/layout/activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <android.support.constraint.ConstraintLayout
  4.  
  5. xmlns:android="http://schemas.android.com/apk/res/android"
  6. xmlns:app="http://schemas.android.com/apk/res-auto"
  7. xmlns:tools="http://schemas.android.com/tools"
  8.  
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"
  11.  
  12. tools:context="com.example.ted.hello2.MainActivity">
  13.  
  14. <EditText
  15. android:id="@+id/editText"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:ems="10"
  19. android:inputType="textPersonName"
  20. android:text="Name"
  21.  
  22. tools:layout_editor_absoluteX="30dp"
  23. tools:layout_editor_absoluteY="44dp"
  24.  
  25. app:layout_constraintTop_toTopOf="parent"
  26. app:layout_constraintStart_toStartOf="parent"
  27. android:layout_marginTop="44dp"
  28. android:layout_marginStart="30dp"
  29. android:layout_marginBottom="31dp"
  30. app:layout_constraintBottom_toTopOf="@+id/textView"/>
  31.  
  32. <TextView
  33. android:id="@+id/textView"
  34. android:layout_width="0dp"
  35. android:layout_height="0dp"
  36. android:text="TextView"
  37.  
  38. tools:layout_editor_absoluteX="30dp"
  39. tools:layout_editor_absoluteY="121dp"
  40.  
  41. app:layout_constraintTop_toBottomOf="@+id/editText"
  42. android:layout_marginBottom="27dp"
  43. app:layout_constraintEnd_toEndOf="@+id/editText"
  44. app:layout_constraintBottom_toTopOf="@+id/button"
  45. app:layout_constraintStart_toStartOf="@+id/button"
  46. android:layout_marginEnd="1dp"/>
  47.  
  48. <Button
  49.  
  50. android:id="@+id/button"
  51. android:layout_width="wrap_content"
  52. android:layout_height="wrap_content"
  53. android:text="Button"
  54. tools:layout_editor_absoluteX="30dp"
  55. tools:layout_editor_absoluteY="170dp"
  56. app:layout_constraintStart_toStartOf="parent"
  57. app:layout_constraintBottom_toBottomOf="parent"
  58. android:layout_marginStart="30dp"
  59. app:layout_constraintTop_toBottomOf="@+id/textView"
  60. android:layout_marginBottom="293dp"/>
  61.  
  62. </android.support.constraint.ConstraintLayout>

 Lorsque vous gérez des événements par programmation, vous travaillerez presque exclusivement dans le fichier de programme principal. Ouvrez MainActivity.java s’il n’est pas encore ouvert, nous pouvons donc ajouter des codes de gestion d’événements. 

Listing 5-4. Main Program File

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Override
  4.  
  5. protected void onCreate(Bundle savedInstanceState) {
  6.  
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9.  
  10. // Write your event handling codes below this line
  11.  
  12. }
  13.  
  14. }

 

  1. Nous allons ajouter tout notre code de gestion d'événement juste après la méthode setContentView; nous avons besoin de cet appel à la méthode afin que tous les objets du fichier de mise en page terminent le processus d'inflation. Le processus d'inflation crée tous les objets View et ViewGroup en tant qu'objets Java que nous pouvons ensuite référencer par programme dans le programme principal. L’ensemble de l’exercice peut être résumé comme suit.
  2. Get a programmatic reference to the Button view
  3. Set a Listener object for it
  4. Override the abstract method defined on the listener object and provide program logic in response to a user action
  5. Vous pouvez obtenir une référence par programme à la vue Bouton à l’aide de l’instruction suivante.
  6. Button objButton = (Button) findViewById (R.id.button);
  7. Vous remarquerez peut-être que lorsque vous tapez l'instruction précédente, AS3 essaie d'inférer et d'offrir des options d'auto-complétion. L’auto-complétion peut vous faire gagner du temps en programmation et vous donne la confiance que vous êtes sur la bonne voie. Si les choses ne se manifestent pas automatiquement, cela signifie généralement que vous faites quelque chose de mal, car AS3 ne le reconnaît pas.
  8. Dans la Figure 5-4, au moment de la saisie du mot «Bouton», il y avait quelques entrées dans les invites de saisie semi-automatique. Chaque fois que cette invite apparaît, vous pouvez utiliser les touches de direction pour choisir l’une des entrées. Si vous appuyez sur la touche Entrée, quelle que soit l'entrée en surbrillance dans la fenêtre contextuelle d'auto-complétion, elle sera mise à la place de la position actuelle du curseur.

 

Figure 5-4. Autocomplete

Une autre chose que vous avez peut-être remarquée est que toutes les occurrences du mot Button sont en rouge; Si vous passez la souris sur «Bouton», AS3 vous informera par le biais de la boîte de dialogue de l'info-bulle qu'il «ne peut pas résoudre le symbole Bouton» (voir Figure 5-5). Cette erreur se produit et AS3 nous le rappelle gentiment car nous devons importer la définition de Button dans le fichier source actuel et nous ne l’avons pas encore fait. 

Figure 5-5. AS3 warnings and errors

Pour résoudre cette erreur, nous devons importer android.view.Button dans le programme principal en tapant l'instruction d'importation n'importe où dans le fichier source avant la déclaration de classe pour MainActivity. Voir l'exemple de code suivant.

  1. import android.view.Button;
  2.  
  3. public class MainActivity extends AppCompatActivity {
  4.  
  5. }

Vous pouvez également passer la souris sur “Bouton”, comme indiqué dans la Figure 5-5, puis effectuer une solution rapide en tapant (Option) + ↵ (Entrée) si vous utilisez macOS. Si vous êtes sous Windows ou Linux, la solution rapide est Alt + ↵ (Entrée). Des solutions rapides résolvent une gamme de problèmes de codage; les déclarations d'importation manquantes en font partie. Après la solution rapide, l’instruction d’importation de la vue Bouton apparaît au-dessus du fichier source, avec les autresdéclarations d'importation.Nous avons ensuite besoin de sélectionner un écouteur pour la vue Button, de créer un objet écouteur pour celui-ci et, enfin, de remplacer la méthode abstraite nécessaire définie par l'objet écouteur. Vous pouvez utiliser la fonction de complétion automatique lorsque vous tapez cette construction.Notez que lorsque vous tapez les codes (Figure 5-6), qui créeront l’objet écouteur, plusieurs correspondances possibles. Ce que nous voulons dans ce cas, c’est la deuxième entrée à partir du haut, celle avec les ellipses enfermés dans une paire d’accolades. C'est en fait un extrait de code. Si nous choisissons cela, nous obtiendrons le code du Listing 5-5

Figure 5-6. Autocompletion for listener object

Listing 5-5. Code Snippet for View.OnClickListener

 

  1. objButton.setOnClickListener(new View.OnClickListener() {
  2.  
  3. @Override public void onClick(View view) {
  4.  
  5. }
  6.  
  7. });
  8.  
  9. After this, all we need to do is write our program logic inside the body of the onClick() method.
  10.  
  11.  
  12.  
  13. Listing 5-6 est la liste complète des codes pour le programme principal.
  14.  
  15. Listing 5-6. MainActivity.java
  16.  
  17. import android.support.v7.app.AppCompatActivity;
  18.  
  19. import android.os.Bundle;
  20.  
  21. import android.view.View;
  22.  
  23. import android.widget.Button;
  24.  
  25. public class MainActivity extends AppCompatActivity {
  26.  
  27. @Override
  28.  
  29. protected void onCreate(Bundle savedInstanceState) {
  30.  
  31. super.onCreate(savedInstanceState);
  32.  
  33. setContentView(R.layout.activity_main);
  34.  
  35. Button objButton = (Button) findViewById(R.id.button);
  36.  
  37. assert objButton != null;
  38.  
  39.  
  40. objButton.setOnClickListener(new View.OnClickListener() {
  41.  
  42.  
  43. @Override
  44.  
  45. public void onClick(View view) {
  46.  
  47. System.out.println("Hello World");
  48.  
  49. }
  50. });

Travailler avec du texte et des boutons

 Parmi les éléments d'interface utilisateur d'Android, les éléments de texte et de bouton sont probablement les plus courants. Dans cette section, nous allons plonger dans un exemple d’application qui nous permettra de travailler avec ces deux éléments. Les détails du projet sont indiqués dans le tableau 5-3. 

Table 5-3. Project Information

Application name

NumberGuess

Project location

Laissez la valeur par défaut

Form factor

Téléphone et tablette seulement

Minimum SDK

API 23 guimauve

Type of activity

Vide

Activity name

MainActivity (par défaut)

Layout name

activity_main (par défaut)

Figure 5-8 shows the UI for the project.

Figure 5-8. View elements for NumberGuess

 Quelques modifications esthétiques et esthétiques ont été apportées aux éléments pour les rendre plus agréables à l’œil.

  1. <EditText
  2.  
  3. android:id="@+id/editText"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content"
  6. android:layout_marginBottom="26dp"
  7. android:ems="10"
  8. android:gravity="center_vertical|center_horizontal"
  9. android:hint="guess a number"
  10. android:inputType="number"
  11.  
  12. app:layout_constraintBottom_toTopOf="@+id/button"
  13. app:layout_constraintEnd_toEndOf="parent"
  14. app:layout_constraintStart_toStartOf="parent"
  15.  
  16. tools:layout_editor_absoluteX="84dp"
  17. tools:layout_editor_absoluteY="106dp"/>

Cette entrée aligne le texte à l'intérieur de la vue en texte brut verticalement et horizontalementL'attribut hint fait apparaître le texte «devinez un nombre» en grisé; c'est une bonne technique à utiliser à la place d'une étiquette réelle, comme une vue texteCela limite l'entrée aux nombres. Si vous n’ajoutez pas cet attribut, l’utilisateur sera libre de taper tout caractère alphanumérique dans le champ; Ensuite, vous devrez peut-être gérer la validation de l'entrée à l'aide de certaines techniques d'expression régulière. Cette approche est tellement plus facile

Remarque : Tous les réglages précédents peuvent également être effectués en mode Création. Vous pouvez définir ces valeurs dans l'inspecteur d'attributs.

Nous utilisons toujours une disposition de contrainte, vous devez donc vous assurer de mettre des contraintes sur chacun des éléments de l'interface utilisateur. Comme dans les projets précédents, cela peut être géré sans trop de difficultés en positionnant manuellement tous les éléments de l'interface utilisateur, en les plaçant à l'emplacement approximatif où vous souhaitez qu'ils apparaissent, puis en utilisant les outils de l'inspecteur de contraintes. Utilisez l'outil «pack» pour les distribuer horizontalement, puis utilisez les «contraintes d'inférence». Cela devrait prendre soin de la mise en page.Le flux de base de cette application est le suivant:1. Lorsque l'application démarre, un nombre aléatoire de 100 à 150 sera généré.2. L'utilisateur devinera quel numéro a été généré en le saisissant dans le champ de texte.3. Si la supposition de l'utilisateur est supérieure au nombre aléatoire, nous afficherons «Deviner plus bas» à l'aide de la vue de texte statique.4. Si la supposition de l'utilisateur est inférieure au nombre aléatoire, nous afficherons"Devinez plus haut" en utilisant la vue de texte statique

1Si l'utilisateur a deviné le nombre correctement, nous afficherons le nombre aléatoire et une note de félicitations dans le champ de texte. 

Listing 5-7. MainActivity Event Handling Code (Folded Methods)

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2.  
  3. int numberToGuess = 0;
  4.  
  5. EditText e;
  6. TextView t;
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) { ... }
  10.  
  11. @Override
  12. public void onClick(View view) { ... }
  13. int initNumberToGuess() { ... }
  14. }

Vous remarquerez peut-être que l'approche de gestion des événements pour ce projet n'utilise pas une classe anonyme ou interne; il n’ya rien de mal à ces approches, mais faire de MainActivity l’objet auditeur offre un certain confort pour cette situation. La logique principale consistant à obtenir l’entrée de l’utilisateur et à la comparer au nombre aléatoire généré résidera dans la méthode onClick. Si cette méthode faisait partie d'une classe anonyme ou d'une classe interne, il aurait alors fallu que les variables contenant EditText et TextView soient déclarées finales. C’est l’une des règles Java relatives aux classes internes; il est acceptable de référencer n’importe quelle variable sur sa classe externe, à condition qu’elle soit finale. Et cela aurait rendu le code un peu plus compliqué que la façon dont il est structuré comme indiqué dans l'extrait 5-7. Les sections suivantes présentent la liste du code de onCreate, onClick et initNumberToGuess, en commençant par le Listing 5-8.

Listing 5-8. onCreate

  1. @Override
  2.  
  3. protected void onCreate(Bundle savedInstanceState) {
  4.  
  5. super.onCreate(savedInstanceState);
  6.  
  7. setContentView(R.layout.activity_main);
  8. numberToGuess = initNumberToGuess();
  9. e = (EditText) findViewById(R.id.editText);
  10.  
  11. t = (TextView) findViewById(R.id.textView);
  12. Button b = (Button) findViewById(R.id.button);
  13. b.setOnClickListener(this);
  14.  
  15. }

 Number Le numberToGuess est initialisé pendant onCreate mais il a été déclaré en tant que variable membre et non en tant que variable locale de onCreate. Nous devons référencer cette variable à partir de la méthode onClick; c’est la raison pour laquelle il a été déclaré membre variableLa variable e est également initialisée ici mais également déclarée comme variable membre; comme numberToGuess, nous devons référencer cette variable à partir de la méthode onClickMême cas que dans la variable t; nous devons également faire référence à cela à partir de la méthode onClick

Listing 5-9. onClick

  1. @Override
  2.  
  3. public void onClick(View view) {
  4.  
  5. int number = Integer.parseInt(e.getText().toString());
  6. if (number == numberToGuess) {
  7. t.setText(number + " is the right number");
  8.  
  9. }
  10.  
  11. else
  12. if (number < numberToGuess) {
  13. t.setText("Guess higher");
  14. }
  15.  
  16. else
  17. if (number > numberToGuess) {
  18. t.setText("Guess lower");
  19. }
  20. Log.i("Ted", numberToGuess + "");
  21. }

La méthode getText de EditText renvoie un type d'objet Editable. c'est presque comme un texte, mais c'est mutable, contrairement à une chaîne. Integer.parseInt, cependant, attend un paramètre String; c’est pourquoi nous avons dû convertir la valeur de retour de getText à l’aide de la méthode toString 

Listing 5-10. initNumberToGuess

int initNumberToGuess() {

  Random r = new Random();                 

   numberToGuess = r.nextInt(100) + 50;      

  Log.i("Ted", numberToGuess + "");

  return numberToGuess; }

La classe Random provient de java.util. Assurez-vous d'importer ce paquet. Sinon, quand il devient rouge dans l'éditeur principal, passez votre souris dessus et utilisez la solution rapide (Alt + Entrée pour Windows et Linux | opt + entrée pour macOS).Ceci définit la plage du nombre aléatoire de 100 à 150

Listing 5-11 shows the full code for MainActivity, for your reference.

  1. package com.ted.numberguess;
  2.  
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. import android.widget.TextView;
  10. import java.util.Random;
  11.  
  12. public class MainActivity extends AppCompatActivity
  13. implements View.OnClickListener {
  14.  
  15. int numberToGuess = 0;
  16. EditText e;
  17. TextView t;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21.  
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24. numberToGuess = initNumberToGuess();
  25. e = (EditText) findViewById(R.id.editText);
  26. t = (TextView) findViewById(R.id.textView);
  27. Button b = (Button) findViewById(R.id.button);
  28. b.setOnClickListener(this); }
  29.  
  30. @Override
  31.  
  32. public void onClick(View view) {
  33.  
  34. int number = Integer.parseInt(e.getText().toString());
  35. if (number == numberToGuess) {
  36. t.setText(number + " is the right number");
  37.  
  38. }
  39.  
  40. else if (number < numberToGuess) {
  41. t.setText("Guess higher");
  42.  
  43. }
  44.  
  45. else if (number > numberToGuess) {
  46. t.setText("Guess lower");
  47.  
  48. }
  49.  
  50. Log.i("Ted", numberToGuess + "");
  51.  
  52. }
  53.  
  54. int initNumberToGuess() {
  55. Random r = new Random();
  56. numberToGuess = r.nextInt(100) + 50;
  57.  
  58. Log.i("Ted", numberToGuess + "");
  59.  
  60. return numberToGuess;
  61.  
  62. }
  63.  
  64. }
  65.  
  66. }
  67.  
  68. }

Listing 5-11. The Full MainActivity

 

 Obtenez une référence programmatique à notre objet Button. findViewById localisera l'objet exact de la vue Button pour nous. R.id.button est la clé pour trouver cet objet. Lorsque le moteur d'exécution Android gonfle le fichier de mise en page, il génère une classe nommée R.java; toutes les représentations d'objet Java de tous les objets de vue définis dans le fichier de mise en page y seront définies. Nous utilisons le R.class (Ressources) pour localiser notre bouton par programmationCeci est juste une programmation défensive; nous essayons de nous assurer que la méthode findViewById a renvoyé un objet réel et qu’il n’est pas nul. Si vous avez déjà rencontré unNullPointerException en Java auparavant, cela peut arriver ici. Si findViewById ne renvoie pas d'objet, votre programme se bloquera pendant l'exécution.Nous voulons répondre à une action de clic. C’est pourquoi la méthode que nous avons choisie est setOnClickListener. Cette méthode nécessite une instance d'un objet écouteur en tant qu'argument. Nous avons implémenté l'objet écouteur en ligne et en tant que classe anonyme - voir la section «Langage Java» sur les classes anonymes dans l'Annexe A

@Override est une annotation; il indique au compilateur que nous avons l'intention de remplacer une méthode dans la superclasse AppCompatActivity et que nous ne définissons pas une nouvelle méthode onCreate dans MainActivity. L'annotation clarifie simplement notre intention pour le compilateur

onClick est une méthode abstraite définie par l'interface View.OnClickListener. Il doit être remplacé pour notre mise en œuvreExécutez le programme dans l'émulateur et ouvrez la fenêtre de l'outil Logcat afin que vous puissiez voir les vidages de la console lorsque vous cliquez sur la vue Bouton. 

Conseil

Lorsque vous avez démarré l'émulateur et y avez déployé l'application, vous pouvez utiliser le bouton «Appliquer les modifications» pour le mettre à jour rapidement, sans créer de nouveau fichier APK ni le transférer dans l'émulateur (Figure 5-7). Cela permet un flux de travail plus rapide lorsque vous effectuez de petits changements de code ou de présentation.

Figure 5-7. Apply changes button