vendredi 11 novembre 2011

Intent : passer d’une Activity à une autre



Depuis le début des tuto Android, nous faisons des mini-applications qui n’utilisent qu’un seul écran, qu’une seule page, en résumé qu’une seule Activity. Pour débuter, c’est très bien mais pour faire une véritable application, il serait utile de savoir comment passer d’une page à une autre, autrement dit d’uneActivity à une autre.
Comme d’habitude, nous allons commencer par un petit peut de code XML.

Code XML

Qui dit nouvel écran, dit nouvelle vue donc nouveau layout. Créez un nouveau fichier XML dans le dossierlayout, et appelez-le afficahgequestionactivity.xml. Nous allons faire une vue très simple, avec un TextView au centre de l’écran qui nous servira à poser une question et deux Button en dessous qui nous permettra d’y répondre. Voici ce que ça donnera schématiquement :


Voici donc le code XML pour réaliser cette vue (cf. ci-dessus)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:gravity="center"
  >
 
   <TextView android:id="@+id/question"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:textStyle="bold"
     android:gravity="center_horizontal"
     />
 
     <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
      android:orientation="horizontal"
      android:paddingTop="30dp"
    >
 
    <Button android:id="@+id/buttonOui"
     android:layout_width="80dp"
     android:layout_height="wrap_content"
     android:text="Oui" />
 
     <Button android:id="@+id/buttonNon"
     android:layout_width="80dp"
     android:layout_height="wrap_content"
     android:text="Non" />
 
  </LinearLayout>
 
</LinearLayout>


Si vous avez des difficultés n’hésitez pas à poser des questions en commentaire.

Passons maintenant au code JAVA, soyez attentif, c’est à partir d’ici que commence la petite subtilité du jour.


Code JAVA


Avant de se lancer dans le code JAVA, je vais vous expliquer un peu le fonctionnement des Intent. LesIntent permettent d’envoyer et recevoir des messages (éventuellement avec des données) pour déclencher une action, dans un composant d’une même application (exemple : une Activity) voir même dans une autre application. Dans notre cas, nous allons utiliser l’Intent pour déclencher dans une autre Activity, une question en fonction de l’item sur lequel on a cliqué, et cette dernière renverra la réponse à l’Activityprincipale. Je ne sais pas si vous avez tout compris, mais je vous avais prévenu, il fallait être attentif… En tout cas si vous n’avez pas tout saisi, ce n’est pas grave vous allez comprendre au fur et à mesure et sinon et bien posez moi des questions !

Commençons par modifier notre Activity principale qui sera l’Activity mère. Ouvrez le fichier JAVA principal (moi je l’ai appelé Tutoriel9_Android.java mais cela dépend du nom que vous lui avez donné, enfin normalement il devrait y avoir qu’un seule fichier dans le dossier src donc vous ne devriez pas vous tromper).

Créez la variable globale suivante (ici elle nous sera pas très utile mais cela permet d’identifier quelleActivity à provoquer le retour d’une valeur lorsqu’on appelle plusieurs Activity dans une même Activity) :
private static final int CODE_DE_MON_ACTIVITE = 1;
Nous allons modifier l’écouteur d’évènement que l’on avait mis en place sur la listView. Remplacez-le par le code suivant :
//On met un écouteur d'évènement sur notre listView
        maListViewPerso.setOnItemClickListener(new OnItemClickListener() {
  @SuppressWarnings("unchecked")
  @Override
          public void onItemClick(AdapterView a, View v, int position, long id) {
 
   //on récupère la HashMap contenant les infos de notre item (titre, description, img)
   HashMap map = (HashMap) maListViewPerso.getItemAtPosition(position);
 
   //On créé un objet Bundle, c'est ce qui va nous permetre d'envoyer des données à l'autre Activity
   Bundle objetbunble = new Bundle();
 
   //Cela fonctionne plus ou moins comme une HashMap, on entre une clef et sa valeur en face
   objetbunble.putString("titre", map.get("titre"));
   objetbunble.putString("description", map.get("description"));
 
   //On créé l'Intent qui va nous permettre d'afficher l'autre Activity
   //Attention il va surement falloir que vous modifier le premier paramètre (Tutoriel9_Android.this)
   //Mettez le nom de l'Activity dans la quelle vous êtes actuellement
   Intent intent = new Intent(Tutoriel9_Android.this, QuestionActivity.class);
 
   //On affecte à l'Intent le Bundle que l'on a créé
   intent.putExtras(objetbunble);
 
   //On démarre l'autre Activity
   startActivityForResult(intent, CODE_DE_MON_ACTIVITE);
         }
         });
Normalement, Eclipse doit vous indiquez une erreur. C’est normal, il ne connaît pas encore la classeQuestionActivity. Nous allons donc la créer. Créez une nouvelle classe dans le dossier src et appelez laQuestionActivity.java.
package com.tutomobile.android.intent;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
public class QuestionActivity extends Activity {
 
   private String titre;
   private String description;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
 
     //on lui associe le layout afficahgequestionactivity.xml
     setContentView(R.layout.afficahgequestionactivity);
 
     //on récupère tous les éléments
        TextView textView = (TextView)findViewById(R.id.question);
        Button buttonOui = (Button)findViewById(R.id.buttonOui);
        Button buttonNon = (Button)findViewById(R.id.buttonNon);
 
        //On récupère l'objet Bundle envoyé par l'autre Activity
        Bundle objetbunble  = this.getIntent().getExtras();
 
        //On récupère les données du Bundle
        if (objetbunble != null && objetbunble.containsKey("titre") && objetbunble.containsKey("description")) {
         titre = this.getIntent().getStringExtra("titre");
                description = this.getIntent().getStringExtra("description");
        }else {
         //Erreur
         titre = "Error";
         description = "Error";
        }
 
        //On créé notre question
     description = description.toLowerCase();
        textView.setText("Utilisez-vous " + titre +" comme "+description+"?");
 
        //On crée un écouteur d'évènement commun au deux Button
        OnClickListener onClickLister = new OnClickListener() {
 
   @Override
    public void onClick(View v){
       switch(v.getId()){
       //si on a cliqué sur le button Oui
       case R.id.buttonOui:
        //si le tire est égale à "Word"
        if (titre.equals("Word")){
         //on renvoi la valeur 1 à l'Activity principal
         setResult(1);
              }else if (titre.equals("Excel")){
               //on renvoi la valeur 2 à l'Activity principal
         setResult(2);
              }else if (titre.equals("Power Point")){
               //on renvoi la valeur 3 à l'Activity principal
         setResult(3);
              }else if (titre.equals("Outlook")){
               //on renvoi la valeur 4 à l'Activity principal
         setResult(4);
              }
        finish();
        break;
       case R.id.buttonNon:
        if (titre.equals("Word")){
         //on renvoi la valeur 5 à l'Activity principal
         setResult(5);
              }else if (titre.equals("Excel")){
               //on renvoi la valeur 6 à l'Activity principal
         setResult(6);
              }else if (titre.equals("Power Point")){
               //on renvoi la valeur 7 à l'Activity principal
         setResult(7);
              }else if (titre.equals("Outlook")){
               //on renvoi la valeur 8 à l'Activity principal
         setResult(8);
              }
        finish();
        break;
       }
      }
 
        };
 
        //on affecte aux Button l'écouteur d'évènement
        buttonOui.setOnClickListener(onClickLister);
        buttonNon.setOnClickListener(onClickLister);
    }
 
}
Ensuite allez dans le fichier AndroidManifest.xml pour lui indiquez la nouvelle Activity grâce à ligne suivant placé entre les balises <application> :
<activity android:name=".QuestionActivity"></activity>
Normalement une fois le projet enregistré (Ctrl+S), Eclipse ne devrait plus voir d’erreur. Nous allons maintenant écrire le code dans l’Activity mère, nous permettant de récupérer la réponse envoyé par notreActivity QuestionActivity. Lorsque que l’on fait setResult cela déclenche la méthode onActivityResult de l’Activity mère. Nous allons donc l’implémenter. Revenez dans l’Activity mère et créez la méthodeonActivityResult grâce au code suivant :
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
     //on regarde quelle Activity a répondu
     switch(requestCode){
     case CODE_DE_MON_ACTIVITE:
 
      //on créé une AlertDialog
      AlertDialog.Builder adb = new AlertDialog.Builder(this);
      adb.setTitle("Votre Réponse");
      adb.setPositiveButton("Ok", null);
 
     //On regarde qu'elle est la réponse envoyée et en fonction de la réponse on affiche un message différent.
      switch(resultCode){
      case 1:
       adb.setMessage("Vous utilisez Word.");
       adb.show();
       return;
      case 2:
       adb.setMessage("Vous utilisez Excel.");
       adb.show();
       return;
      case 3:
       adb.setMessage("Vous utilisez Power Point.");
       adb.show();
       return;
      case 4:
       adb.setMessage("Vous utilisez Outlook.");
       adb.show();
       return;
      case 5:
       adb.setMessage("Vous n'utilisez pas Word.");
       adb.show();
       return;
      case 6:
       adb.setMessage("Vous n'utilisez pas Excel.");
       adb.show();
       return;
      case 7:
       adb.setMessage("Vous n'utilisez pas Power Point.");
       adb.show();
       return;
      case 8:
       adb.setMessage("Vous n'utilisez pas Outlook.");
       adb.show();
       return;
      }
     }
    }


Voilà normalement, tout est bon vous pouvez lancer l’application. Je vous mets trois screenshots des trois phases.

Screeshot 1 : On lance l’application, on choisit un item en cliquant dessus, ce qui va afficher la deuxième Activity (dans mon exemple, j’ai cliqué sur Outlook).


Screnshot 2 : On arrive sur la deuxième Activity qui nous pose une question. Il nous suffit d’y répondre en cliquant sur Oui ou Non (dans mon exemple, j’ai cliqué sur Non).


Screnshot 3 : La réponse envoyée par l’Activity fille s’affiche dans l’Activity mère. Tout fonctionne !


Ainsi s’achève ce tutoriel Android qui n’était pas facile du tout. J’espère que mes explications ont été claires et puis bon comme je suis dans un bon jour et surtout comme vous avez travaillé dur pour arriver jusqu’ici, je vais vous fournir les sources du programme

0 commentaires:

Enregistrer un commentaire

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free Android website | Bloggerized by wassim El mririe - Ramzi Essid | TO Best Web Host