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