Apprendre à passer des données entre deux activités via des extras en programmation Android

Prérequis pour bien comprendre ce tutoriel :

  • connaître les bases de la programmation Android (Java et XML) ;
  • utiliser Android Studio (conseillé) ;
  • savoir ouvrir une nouvelle activité en utilisant un Intent.

Pour réagir à ce tutoriel, un espace de dialogue vous est proposé sur le forum. 1 commentaire Donner une note à l'article (5)

Article lu   fois.

Les deux auteurs

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Aujourd'hui nous allons voir comment passer des données entre deux activités.


Cliquez pour lire la vidéo


II. Création des layouts

Nous allons avoir besoin de données à passer entre nos deux activités ! Notre activité principale se nomme “MainActivity” et notre seconde activité « MaDeuxiemeActivity ». Nous ne ferons donc pas dans l'originalité, mais les noms sont explicites !

Nous allons, dans notre  activité principale, créer un petit formulaire dans le layout, et envoyer les données, qui auront été entrées dans le formulaire, à la seconde activité.

Pour faire simple, notre formulaire sera uniquement composé :

- d'un EditText dans lequel on pourra entrer le texte que l'on souhaite ;

- d'un bouton pour valider et passer le texte à la seconde activité. Pour lancer la seconde activité, nous utiliserons l'attribut onClick qui appellera la méthode « ChangeActivity » que l'on implémentera côté Java. Cependant, libre à toi d'utiliser un listener sur ton bouton si tu as plutôt l'habitude d'utiliser cette méthode.

Je te laisse le faire, et tu devrais obtenir un fichier XML de ce style :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
            tools:context="com.example.formation.changementactivity.MainActivity">
 
            <EditText
            android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/bt"
            />
 
            <Button
            android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
            android:text="Changer d'activity"
        android:onClick="ChangeActivity"
        android:layout_centerInParent="true"
            />
 
</RelativeLayout>

Image non disponible

La seconde activité comporte uniquement un TextView qui permettra d'afficher ce qui lui aura été passé par la première activité :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.formation.changementactivity.MaDeuxiemeActivity"
            android:gravity="center"
            android:orientation="vertical"
            >
 
            <TextView
            android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
            android:text="Tu es sur la deuxieme activity"
            />
</LinearLayout>

III. Passer des extras (c'est-à-dire des données) à la seconde activité

Maintenant que tu as ton layout de prêt, nous pouvons passer à la partie intéressante qui va se produire du côté du Java !

Nous allons implémenter notre méthode ChangeActivity, dont voici le prototype :

public void ChangeActivity(View view)

Dans un premier temps, nous allons récupérer notre EditText avec la méthode findViewById, que tu dois avoir l'habitude d'utiliser :

EditText = (EditText) findViewById(R.id.et1);

Il va ensuite falloir récupérer la String qui a été rentrée dans l'EditText. Attention, l'EditText n'est pas capable de nous retourner directement la String qui a été saisie. Il faut d'abord récupérer le Text puis le convertir en String :

String str = editText.getText().toString();

Très bien ! Nous allons pouvoir passer cette chaîne de caractères à notre seconde activité. Mais pour l'exemple d'aujourd'hui, nous allons aussi passer un entier. Il représente simplement le nombre de caractères qui se trouve dans la String. Tu dois te dire que ça ne sert à rien de passer cette donnée à notre seconde activité et tu as tout à fait raison, mais comme ça nous allons pouvoir passer deux types de données différents : une String et un entier. Pour récupérer cet entier, il suffit d'appeler la méthode length sur notre String :

int nbLettre = str.length();

Là nous avons toutes les données que nous allons passer à notre seconde activité, à savoir la String et l'entier.

Comment allons-nous faire ça ?

Tu dois savoir que pour passer d'une activité à une autre, nous utilisons un Intent. Dans notre cas, pour passer de notre « MainActivity » à « MaDeuxiemeActivity », nous utilisons le code suivant (toujours dans la méthode ChangeActivity) :

 
Sélectionnez
1.
2.
Intent intent = new Intent(this, MaDeuxiemeActivity.class);
startActivity(intent);

Nous allons ajouter des extras à cet Intent (ce seront les données), à savoir la String et l'entier.

Comment fonctionne un Extra ? Un extra est un couple clé/valeur, basé sur le système Bundle :

  • la clé est l'identifiant, tu peux mettre ce que tu veux, c'est simplement une chaîne de caractères ;
  • la valeur est la valeur de ta donnée. Elle sera associée à la clé.

Ainsi, quand tu vas créer un extra, tu vas lui donner une clé et une valeur. En revanche, quand tu voudras récupérer ton extra, tu lui donneras la clé et il te renverra la valeur associée. Nous allons à présent voir ensemble comment faire ça concrètement.

Tu vas pouvoir ajouter des extras à ton Intent entre le moment où tu as créé ton Intent et le moment où tu appelles startActivity. Pour cela, tu vas appeler la méthode putExtra sur ton Intent qui prend deux arguments :

  • le premier argument : la clé ;
  • le second : la valeur.

Tu ajoutes la String et l'entier comme extra, ce qui doit te donner :

 
Sélectionnez
1.
2.
3.
4.
Intent intent = new Intent(this, MaDeuxiemeActivity.class);
intent.putExtra("edittext", str);
intent.putExtra("nbLettre", nbLettre);
startActivity(intent);

Si tu avais voulu utiliser directement le système bundle, le code aurait plutôt ressemblé à ça :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
Intent intent = new Intent(this, MaDeuxiemeActivity.class);
Bundle bundle = new Bundle();
bundle.putString("edittext ", str);
bundle.putString("nbLettre", nbLettre);
intent.putExtras(bundle);
startActivity(intent);

L'intérêt du bundle, c'est qu'il peut être retourné par une classe indépendante de l'Activity sur laquelle tu travailles.

IV. Récupérer les extras dans la seconde activité

Dans ta seconde activité, dans la méthode onCreate et juste après l'appel de la méthode setContentView, nous allons pouvoir récupérer nos extras.

Pour cela, tu dois d'abord récupérer l'Intent de la manière suivante :

Intent intent = getIntent();

Si l'Intent récupéré n'est pas null, tu vas pouvoir effectuer les actions nécessaires pour récupérer les extras. A priori, Intent n'est pas null, mais c'est une bonne pratique de vérifier, quand tu utilises un objet, qu'il n'est pas null. Ça t'évitera des crashs si jamais il est null pour une raison x ou y. On le fait pour éviter les soucis plus tard.

 
Sélectionnez
1.
2.
3.
if (intent != null){
    // Le code pour récupérer les extras ira ici
}

On va vouloir, dans un premier temps, récupérer notre String. Tu vas donc créer la variable à laquelle sera assignée la valeur que l'on va récupérer :

String str = "";

On va d'abord vérifier que notre Intent a bien une valeur associée à la clé « edittext ». Pour cela, nous allons simplement ajouter une condition et si la clé existe bien, on récupérera la valeur qui lui est associée :

 
Sélectionnez
1.
2.
3.
4.
String str = "";
if (intent.hasExtra("edittext")){ // vérifie qu'une valeur est associée à la clé “edittext”
    str = intent.getStringExtra("edittext"); // on récupère la valeur associée à la clé
}

Tu remarqueras que nous avons appelé la méthode « getStringExtra », car la valeur que l'on souhaite récupérer est de type String.

Si tu avais utilisé un bundle pour passer tes données à la seconde activité, tu aurais dû récupérer ta String de cette façon :

 
Sélectionnez
1.
2.
Bundle bundle = getIntent().getExtras();
str = bundle.getString("edittext");

Nous allons maintenant récupérer notre extra de type « int », qui représente le nombre de lettres contenues dans la String. Étant donné que cette fois tu souhaites récupérer un « int », tu vas appeler la méthode « getIntExtra » sur ton Intent. Si tu avais voulu récupérer un double, tu aurais appelé getDoubleExtra, etc. Il existe une méthode pour chaque type natif de Java.

Tu remarqueras que l'on n'a pas vérifié si la clé existe en appelant la méthode « hasExtra » comme nous l'avons fait tout à l'heure. Pourquoi ? Parce que pour les entiers, si la clé n'existe pas, on peut renvoyer une valeur par défaut. Ce n'est pas possible avec les Strings, si la clé n'existe pas, la méthode « getStringExtra » nous renvoie null.

Dans notre cas, on va renvoyer 0 si la clé « nbLettre » n'existe pas. Il n'est pas nécessaire de faire un traitement plus poussé si la clé n'existe pas, car ce n'est pas critique dans notre application.

int nbLettre = intent.getIntExtra("nbLettre", 0);

V. Afficher les données que nous avons récupérées

Nous allons récupérer le TextView dans notre seconde activité :

TextView textView = (TextView) findViewById(R.id.tv1);

Maintenant il ne reste plus qu'à afficher nos données en utilisant le TextView ! Nous allons afficher la String récupérée, suivie d'un point-virgule et du nombre de lettres contenues dans la String :

textView.setText(str + "; " + nbLettre);

Le code complet de ta seconde activité devrait ressembler à ça :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ma_deuxieme);
 
    Intent intent = getIntent();
    if (intent != null){
        String str = "";
        if (intent.hasExtra("edittext")){
            str = intent.getStringExtra("edittext");
        }
        int nbLettre = intent.getIntExtra("nbLettre", 0);
        TextView textView = (TextView) findViewById(R.id.tv1);
        textView.setText(str + "; " + nbLettre);
    }
}

VI. Testons notre code

Dans notre première activity, j'écris « coucou » et je clique sur le bouton « Changer d'activity » :

Image non disponible

La seconde activité affiche bien « coucou » suivi du nombre de lettres, à savoir six, ce qui signifie que nous avons bien réussi à envoyer et récupérer les données voulues entre deux activités. Attention, si le nombre de lettres affiché pour toi est sept, c'est probablement que ton appareil Android t'a ajouté une espace après que tu as écrit « coucou », ce qui te donne  »coucou  ».

Image non disponible

Le tutoriel d'aujourd'hui touche à sa fin, j'espère qu'il t'a plu. Je te souhaite une bonne journée et je te dis à la prochaine !

VII. Note de la rédaction de developpez.com

Nous tenons à remercier Jacques_jean pour la relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2017 BeeApps - Sébastien DEPARDI. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.