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 :
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>
La seconde activité comporte uniquement un TextView qui permettra d'afficher ce qui lui aura été passé par la première activité :
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) :
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 :
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 :
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.
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 :
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 :
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 :
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 » :
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 ».
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.