Skip to content

16 juillet 2010 | Rédigé par Axon

56

Intent : passer d’une Activity à une autre [Tutoriel Android n°11]

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’une Activity à une autre.

Pour cela nous allons réutiliser une application que l’on a déjà faite auparavant. Il s’agit du tutoriel n°7 : Personnaliser une ListView. Si vous ne l’avez pas faite, il est indispensable de la réaliser pour pouvoir faire ce tutoriel Android.

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 dossier layout, 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. Les Intent 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’Activity principale. 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 quelle Activity à 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 classe QuestionActivity. Nous allons donc la créer. Créez une nouvelle classe dans le dossier src et appelez la QuestionActivity.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 notre Activity 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éthode onActivityResult 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. C’est par ici (le mot de passe c’est Intent_TutoMobile).

Découvrez d'autre articles de la catégorie Tutoriels Android

Encore un peu de lecture :

56 Commentaires Poster un commentaire
  1. Zizina
    9 fév 2013

    Bonjour à tous!

    je voulais comparer deux edittexts de deux vues differentes dont l’une fait appel à l’autre et après comparaison je voulais affiché un petit toast(message) si les contenus sont different sinon je passe à l’etape suivante.
    je suis bloqué, si peut m’aider.

  2. Slama dhouha
    15 fév 2013

    mon question est:est ce que on peut utiliser se code dans une application dont on a dans la première activité une ImageView qui doit nous permet lors d’un Click sur l’image de passer à une deuxième activité a comme item un bouton audio.

  3. hamid
    7 mai 2013

    salu svp la method maListViewPerso.setOnItemClickListener ce trouve ou ?

Trackbacks & Pingbacks

  1. Les tweets qui mentionnent Android Intent : comment passer d'une Activty à une autre | Tuto Mobile -- Topsy.com
  2. Tuto développement Android : Intent, passer d'une Activity à une autre
  3. Tutos Android GUI (User Interface) | Pearltrees

Une question, une suggestion, une opinion? Partagez ce que vous pensez, laissez un commentaire.

(obligatoire)
(obligatoire)

Note: Votre adresse email ne sera jamais publiée.

Suivez les réponses aux commentaires