juil
18
2010

[Tutoriel android] Partie 3 – Une petite intention ?

Plus d’informations sur les intent

Dans le tutoriel précédent, nous avions vu l’utilisation des intent pour passer d’une activité à l’autre ; aujourd’hui nous allons faire un pas de plus vers l’utilisation de cette mécanique.

Nous allons, tout d’abord, reprendre l’exemple final du tutoriel précédent et le modifier au fur et à mesure pour appréhender ces nouvelles facettes.

Nous étions restés sur le code de notre bouton comme cela :

@Override

public void onClick(View v) {

if(v == monBouton) {

Intent monIntent = new Intent(this,MonAutreActivite.class);

startActivity(monIntent);

}

}

L’intent était chargé d’appeler l’activité secondaire et par le biais de la méthode startActivity de l’afficher.

Imaginons que notre activité secondaire est un résultat à retourner à notre activité principale.

Nous allons rajouter un type de code de retour à notre activité à vérifier pour le retour d’une action fournissant un résultat.

public static final int CODE_RETOUR = 0;

On nommera ce type CODE_RETOUR avec une valeur de 0 pour l’identifier, ensuite nous allons utiliser la méthode startActivityForResult() pour lancer une autre activité et attendre un retour de celle-ci.

@Override

public void onClick(View v) {

if(v == monBouton) {

Intent intent = new Intent(this,MonAutreActivite.class);

startActivityForResult(intent, CODE_RETOUR);

}

}

Cette méthode prend en paramètres l’intent, ainsi que le code de retour attendu.

La classe Activity contient une méthode nommée onActivityResult, déclenchée à chaque retour d’un résultat d’une activité tierce demandée. Cette méthode contient 3 paramètres : le premier spécifie le numéro de code retourné (dans notre exemple CODE_RETOUR), le second paramètre est le résultat retourné (3 valeurs possible RESULT_CANCELED,RESULT_OK,RESULT_FIRST_USER) et pour finir l’intent de retour.

Nous allons utiliser une autre mécanique de l’intent que l’on appelle les Extras. C’est une manière de passer des informations d’une activité à l’autre, les méthodes putExtra de l’objet intent est la source de ce mécanisme. Je vous renvoie à la documentation d’android pour plus d’informations sur le type de données à passer en paramètres.

http://developer.android.com/reference/android/content/Intent.html

Nous allons coder la partie qui va effectuer la vérification des données lorsqu’un retour est demandé.

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// Vérification du code de retour

if(requestCode == CODE_RETOUR) {

// Vérifie que le résultat est OK

if(resultCode == RESULT_OK) {

// On récupére le paramètre "Nom" de l'intent

String nom = data.getStringExtra("Nom");

// On affiche le résultat

Toast.makeText(this, "Votre nom est : " + nom, Toast.LENGTH_SHORT).show();

// Si l'activité est annulé

} else if (resultCode == RESULT_CANCELED) {

// On affiche que l'opération est annulée

Toast.makeText(this, "Opération annulé", Toast.LENGTH_SHORT).show();

}

}

}

Jusque-là rien de difficile à comprendre j’espère ? Nous allons alors passer à la deuxième activité et la modifier.

Commençons par éditer le layout (layoutcoucou.xml), pour cela nous allons rajouter un textview, un edittext et enfin un bouton.

Le textview contiendra l’intitulé de la question, l’edittext permettra à l’utilisateur d’entrer son nom et le bouton de retourner les informations.

<?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">

<TextView

android:text="Quel est votre nom ?"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

</TextView>

<EditText

android:id="@+id/editTextNom"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

</EditText>

<Button

android:id="@+id/ButtonValider"

android:text="Valider"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

</Button>

</LinearLayout>

Ps : N’oubliez surtout pas les ID de chaque élément, ainsi que la déclaration de la seconde activité dans l’AndroidManisfest.xml :whistle:

Dirigeons-nous sur le code de notre seconde activité et rajoutons une petite portion de code pour permettre à notre activité actuelle de retourner un résultat.

Tout d’abord, on récupère le bouton ainsi que le textview de notre Layout ; puis dans le listener de l’évènement onClick du bouton, nous allons renvoyer un résultat par l’intermédiaire de la méthode setResult() qui prend deux paramètres : le code de retour ainsi qu’un Intent si besoin est.

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.layoutcoucou);

Button boutonValider = (Button)findViewById(R.id.ButtonValider);

final EditText editTextNom = (EditText)findViewById(R.id.editTextNom);

boutonValider.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// On vérifie que la taille de la chaine de retour est supèrieur à 0

if(editTextNom.getText().length() > 0) {

// Création de l'intent

Intent intent = new Intent();

// On rajoute le nom saisie dans l'intent

intent.putExtra("Nom", editTextNom.getText().toString());

// On retourne le résultat avec l'intent

setResult(RESULT_OK, intent);

// On termine cette activité

finish();

}

}

});

}

Regardez bien les commentaires dans le code qui permettent de comprendre le fonctionnement !

Lancez l’application et cliquez sur le bouton “Cliquez ici !”. Si l’on clique sur le bouton “Retour” sur le téléphone, le retour est équivalent à RESULT_CANCELED et le message “Opération annulé” s’affiche.

RESULT_CANCELED

Par contre, si l’on rentre un nom et que l’on clique sur le bouton “Valider”, le code de retour est RESULT_OK et un autre message s’affiche alors.

RESULT_Ok

Et voilà, vous savez désormais utiliser la méthode setActivityForResult et le passage de données par le biais des intent !

Les intent à travers Android

Les intent, comme je le précise dans le tutoriel précédent, ne servent pas qu’à lancer une activité dans notre application. Ils peuvent aussi lancer d’autres actions à travers le système, je ne vais pas faire un cours complet sur ceux-ci mais juste vous donner quelques exemples d’utilisations pour y voir plus clair.

Par exemple, pour ouvrir une page web à partir de votre application, il suffit d’utiliser un autre constructeur de l’objet Intent.

La définition de celui-ci est la suivante : Intent(String action, Uri uri);

Son premier paramètre est une action définie dans la classe Intent et le second une Uri (Uniform Resource Identifiers). Je vous mets le lien de la documentation android à disposition pour cette classe :

http://developer.android.com/reference/android/net/Uri.html

Vous avez trouver comment ouvrir une page web ? Non et bien je vous montre :

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.fr"));

startActivity(intent);

On retrouve l’action ACTION_VIEW qui permet la visualisation, ainsi que l’url de la page web passée en paramètres au parser de données de la classe Uri fournie par le SDK.

Ps : Si vous avez plusieurs navigateurs sur votre plateforme, une fenêtre s’affichera vous demandant de choisir celui dans lequel vous désirez afficher la page.

Un dernier petit exemple pour la route allez !

Comment appeler une personne grâce aux intent, vous avez 10 minutes ! Tic Tac Tic Tac ^_^

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:0603040809"));

startActivity(intent);

L’action ACTION_CALL permet de notifier au système que l’on va émettre un appel, puis le numéro de téléphone préfixé par “tel:” sinon cela ne fonctionnera pas.

N’oubliez pas de rajouter la permission à votre application sinon vous n’aurez pas l’autorisation de passer un appel.

Allez dans le ficher AndroidManisfest.xml, puis dans l’onglet “Permissions”, faites “Add” et “Uses permission” avec comme valeur android.permission.CALL_PHONE.

Et voilà le tour est joué ça fonctionne ! On peut passer un coup de téléphone par l’intermédiaire de notre application.

A bientôt pour de nouvelles aventures !

Download PDF
  • http://SiteWeb Nicolas

    Bonjour,

    Pour commencer, je ne suis pas un as de java mais plus du c++.
    A ce titre, je ne connais pas encore toutes les spécificités de java.
    Dans ton code, tu utilises pour déclarer le champ texte le code suivant :
    final EditText editTextNom

    A quoi sert le “final” ? quel est son rôle ?

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Bonjour Nicolas,

    Je te propose une petite explication via un site internet car c’est assez long à expliquer selon le contexte.

    http://bruce-eckel.developpez.com/livres/java/traduction/tij2/?chap=7&page=2

    J’espère que cette explication te suffiras :)

    Bonne journée

  • http://SiteWeb Nicolas

    Merci pour le lien très instructif !

  • http://SiteWeb anthony

    “Final” est le “const” du c++ en quelques sortes, avec quelques différences. Très bon tes tutos. Mon but est de faire un jeu 2D d’abord et un autre en 3D ensuite, tes tutos m’aident bien pour commencer, merci à toi ;o) j’espère qu’il y a de nouveaux tutos de prévu, à ce rythme je les aurait tous fais dans pas longtemps

  • http://SiteWeb mike

    Merci pour ce tuto, j’y vois plus clair dans les intents.
    Par contre, je me pose la question sur ta méthodologie d’utilisation des Listeners.

    Dans le tuto 2, tu as l’air de dire qu’il est préférable que la classe où se trouve le bouton implémente OnClickListener mais dans ce tuto 3, tu ne le fais pas pour la 2ème activity (MonAutreActivite). Y a t il une raison particulière ?

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Si il y’a beaucoup de code il est préférable que celui-ci soit séparer (question de lisibilité) après tu peux le faire comme tu veux c’est au goût de chacun.

  • http://SiteWeb darkneo

    Bonjour, merci pour ce super tuto! Juste une petite question, dans le sens inverse comment t’y prendrais-tu pour passer des données de ton activité 1 à ton activité 2 ?? (Exemple pratique, je voudrais que mon activité 2 affiche un texte particulier en fonction du bouton sur lequel j’ai cliqué dans l’activité 1)

    Merci d’avance :happy:

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Grâce au intent toujours tout est décrit dans le tutoriel, je ne vois pas réellement ce que tu cherches

  • http://SiteWeb darkneo

    Pardon j’ai dû mal m’exprimer. Je retente ma chance.
    D’après le tuto on lance l’activité MonAutreActivite depuis MonActivite via le code suivant :
    Intent intent = new Intent(this,MonAutreActivite.class);
    startActivityForResult(intent, CODE_RETOUR);
    Donc je comprend (peut-être à tord) que je ne peux pas passer de paramètre à MonAutreActivite via la méthode startActivityForResult (par exemple lui passer un objet, une string, etc… pour que MonAutreActivite démarre dans un état prédéfini par les paramètres que j’aurai passé)
    Donc l’autre solution serait de récupérer la référence de MonActivite une fois MonAutreActivite lancée, comment s’y prendre ? Ou alors il y a une toute autre solution ? merci!!

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Tu démarres MonAutreActivite avec un Intent, alors tu peux toujours utiliser la méthode putExtra(type) de l’intent pour envoyer les donner à ta deuxième activité.

  • http://SiteWeb darkneo

    C’est bon en fait il suffit d’appeler getIntent() dans le onCreate de MonAutreActivite. Merci!

  • http://clementhallet.be clément

    Bonjour,

    Merci pour ce tuto, cependant j’ai une question;
    J’ai crée des onglets sur mon appli, mais je ne sais pas comment récupérer l’intent qui est crée pour lancer une des methodes de classes, je m’explique :

    TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost); // Le TabHost a des Tabs
    TabSpec firstTabSpec = tabHost.newTabSpec(“tid1″); // TabSpec: new tab – TabSpec : setContent to the tab
    TabSpec secondTabSpec = tabHost.newTabSpec(“tid1″);
    TabSpec thirdTabSpec = tabHost.newTabSpec(“tid1″); // tid1 is firstTabSpec Id (used to access outside)
    // Dans un TabHost, y’a 3 TabSpec

    /** TabSpec setIndicator() indique le nom et les param — TabSpec setContent() règle le contenu d’une tab */
    firstTabSpec.setIndicator(“Informations”, getResources().getDrawable(R.drawable.database)).setContent(new Intent(this,FirstTab.class));
    secondTabSpec.setIndicator(“Graphiques”, getResources().getDrawable(R.drawable.chart)).setContent(new Intent(this,SecondTab.class));
    thirdTabSpec.setIndicator(“Réglages”, getResources().getDrawable(R.drawable.settings)).setContent(new Intent(this,ThirdTab.class));
    // On déclare un Intent qui sera utilisé pour lancer les activités enfants

    /** Ajout des tabSpec sur le TabHost to display. */
    tabHost.addTab(firstTabSpec);
    tabHost.addTab(secondTabSpec);
    tabHost.addTab(thirdTabSpec);
    // On ajoute les TabSpec au TabHost

    C’est un bout de code de mon main.
    J’y ai mis un Lisneter, et je doit lancer une methode de la classe SecondTab, comment procéder?
    Je pensais que ej vouvais récupérer le nom de l’objet crée via l’intent pour fairre objetdeSecondTab.methodeDeSecondTab(); , mais je ne sais pas comment aller chercher objetDeSecondTab … vu que ce sont des intents et pas de simple créations d’ojbets…

    PS: Je ne peut pas utiliser des methodes statiques.

    J’attend de te lire avec impatience, Clems :lol:

  • jean

    DARKNEO: L’option réellement absente dans le système android dans la passation de données d’une ‘intent’ à une autre est la possibilité de transmettre un référence. La solution ‘putextra’ concerne les Strings. Je voulais passer des ‘Views’ entier à une époque, d’une ‘intent’ à une autre, pour réutiliser du boulot existent…j’ai du tout réécrire …:lol:

  • Julien

    Bonjour,

    Merci pour ce tuto et pour tous les autres. Tu m’as permis de me lancer dans la prog android.
    J’ai pour habitude d’essayer de résoudre mes problèmes moi même pour apprendre (même si parfois ‘est laborieux) mais la je bloque vraiment….

    Voici mon problème si quelqu’un pouvait m’aider.

    J’utilise la bibliotheque AndEngine pour gérer le graphisme d’un jeu.
    J’ai une pièce principale (contenu dans mon activité principale) et j’y déplace une image grâce aux fonctions d’un pad analogique intégré a Andengine.
    Quand mon image passe à un endroit précis, j’ouvre une nouvelle activité avec la fonction StartActivityForResult() . La nouvelle activité se lance bien et c’est le même principe j’y déplace une image grâce au pad analogique.
    Et la vient mon problème: lorsque je veux faire un Finih() en passant à un certain endroit de la map, l’application plante (par contre si je met le finish à la fin de la fonction onLoadResources ressources de ma 2nd activité ca revient correctement à la fonction principale.
    J’ai essayé de mettre le finish sur le onControlClick du pad analogique mais ca plante aussi….

    Merci d’avance pour votre aide

  • holaroid

    slt, je suis trés novice en prog ce qui me donne inéluctablement un mauvais résultat, super tuto mais le hic avec moi c’est que tous ces bouts de code sont bien expliqué mais aucune indication(selon moi) pour ou les mettre, faut peut étre que quelqu’un me dise comment est la structure du programme et pour la méthode “onActivityResult” se met dans la class activity MonActivite ou dans MonAutreActivite
    merci.

  • http://www.ace-art.fr/wordpress/ Pierre-Emmanuel Mercier

    Le onActivityResult se trouve dans ta première activité, dans eclipse si tu fais ctrl + espace, une boite de dialogue s’ouvre, si tu cherche le onActivityResult dedans tu le choisis et il va s’ajouter automatiquement ;)

Switch to mobile version