samedi 8 octobre 2011

Changement de vues android

Ce tutoriel va pousser un peu plus loin la création et la gestion des vues sous Android. Dans ce dernier, vous allez apprendre à gérer le passage d’une vue à une autre dans votre application.
Un passage d’une vue à une autre signifie un changement d’activité avec passage de données si nécessaire entre les deux activités

pré-requis

Pour ceux n’ayant pas fait ce tutoriel, voici le code source ici
Et voici ce que vous devez obtenir juste en compilant le code
Nous allons faire en sorte que lorsqu’un utilisateur clique sur le bouton “Se connecter”, il soit redirigé vers une autre vue.

Création de la deuxième activité

Nous allons commencer par créer une deuxième activité, cette dernière va afficher l’adresse mail et mot de passe saisie dans la vue de login.
Une création de vue débute toujours par la création du fichier XML. Que l’on appellera “login_display.xml
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
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 android:layout_width="fill_parent" android:orientation="vertical"
 android:layout_height="fill_parent"
 android:background="@drawable/bg">
 
<LinearLayout
 android:layout_width="fill_parent" android:orientation="vertical"
 android:layout_height="fill_parent" android:paddingTop="80px" android:gravity="center">
 
 <TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
 android:text="@string/email" android:textSize="20px" android:textStyle="bold"
 android:textColor="#000000" />
 
 <TextView   android:layout_height="wrap_content" android:layout_width="wrap_content"
 android:id="@+id/email_display" android:textColor="#000000" android:textSize="20px"
 android:hint="Ici l'adresse mail des utilisateurs" android:gravity="center"/>
 
 <TextView android:layout_height="wrap_content" android:layout_width="wrap_content"
 android:text="@string/password" android:textSize="20px" android:paddingTop="20px"
 android:textColor="#000000"  android:textStyle="bold"/>
 
 <TextView   android:layout_height="wrap_content" android:layout_width="wrap_content"
 android:id="@+id/password_display" android:textColor="#000000"  android:textSize="20px"
 android:hint="Ici le mot de passe de l'utilisateur" android:gravity="center"/>
 </LinearLayout>
</LinearLayout>
  • Voici quelques explications de ce code :
    • android:paddingTop : C’est pour l’espacement du haut du Layout (un peu comme en HTML).
    • android:gravity : Spécifie où placer le conteneur.
    • android:textSize : Spécifie la taille de texte.
    • android:textStyle : Spécifie un style au texte (bold, italic, bolditalic).
    • android:textColor : Spécifie la couleur du texte (ici on choisie du Blanc).
    • android:id : Donne un “id” à l’objet, afin de pouvoir y accéder depuis vos classes java.
    • android:hint : Met un texte par défaut sur la zone. Ce texte sera affiché quand aucun “android:text” n’est défini (sert surtout en texte d’indication pour des champs de formulaire par exemple).
    • TextView : Représente un champs d’affichage de texte.
    • Les autres champs sont expliqués dans le tutoriel Introduction aux vues sous Android
Ensuite on crée l’activité (classe Java) correspondante à la vue que l’on vient de créer. On l’appellera “DisplayLoginActivity.java”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.tuto.android.view;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
 
public class DisplayLoginActivity extends Activity
{
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.login_display);
 }
}
Une des erreurs les plus fréquentes est d’oublier de déclarer notre nouvelle activité dans le fichier “AndroidManifest.xml”.
Dans la balise “application”, on rajoute la ligne suivante (On met toujours un point devant le nom de la classe) :
1
<activity android:name=".DisplayLoginActivity" />
Ce qui donnera comme fichier :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
 package="com.tuto.android.view"
 android:versionCode="1"
 android:versionName="1.0">
 <application android:icon="@drawable/icon" android:label="@string/app_name">
 <activity android:name=".MainViewActivity"
 android:label="@string/app_name">
 <intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 <activity android:name=".DisplayLoginActivity" />
 </application>
</manifest>
le fichier “strings.xml”, qui se trouve dans le dossier res/values a été mis à jour. Il ressemble maintenant à :
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string name="hello">Hello World, MainViewActivity!</string>
 <string name="app_name">ViewProject Exemple</string>
 <string name="password">Mot de passe </string>
 <string name="email">Adresse mail </string>
 <string name="create">Créer un compte</string>
 <string name="connect">Se connecter</string>
</resources>
Ces différentes données seront accessibles via “@string/nomDeVariable
Voilà, notre deuxième activité est créée mais ne sert à rien pour l’instant car elle n’est pas reliée à notre première activité.

Passage d’une activité à une autre

Nous allons mettre en place le passage d’une activité à une autre, donc pour cela revenons dans la classe “MainViewActivity.java”.
Le passage d’une activité à une autre se fait en plusieurs parties :
  • On déclare un nouveau “OnClickListener” à qui on va assigner une action (Ici le passage vers l’autre activité).
    • Pour le passage d’une activité à une autre c’est facile.
    • On crée un nouveau Intent (Le premier argument est l’activité de départ et le deuxième est l’activité d’arrivée).
    • On appelle la méthode “startActivity” avec ce nouveau Intent.
  • On récupère le bouton auquel on veux assigner ce Listener.
  • On affecte le Listener au Bouton.
Donc à la fin de la méthode OnCreate on va rajouter le code suivant :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//On crée le Listener sur le Bouton
OnClickListener ButtonConnexion = new OnClickListener()
{
 @Override
 public void onClick(View actuelView)
 {
 // On met en place le passage entre les deux activités sur ce Listener
 Intent intent = new Intent(MainViewActivity.this,
                                      DisplayLoginActivity.class);
 startActivity(intent);
 }
};
 
//On récupere le bouton souhaité et on lui affecte le Listener
Button bouton = (Button) findViewById(R.acountcreation.connect);
bouton.setOnClickListener(ButtonConnexion);
Donc maintenant quand on cliquera sur le bouton “Connect” la nouvelle vue s’affichera.
Donc le fichier « DisplayLoginActivity.java » ressemble à ça :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.tuto.android.view;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
 
public class DisplayLoginActivity extends Activity
{
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.login_display);
     Intent thisIntent = getIntent();
     String login = thisIntent.getExtras().getString("login");
     String pass = thisIntent.getExtras().getString("password");
 
     TextView loginText = (TextView) findViewById(R.id.email_display);
     loginText.setText(login);
 
     TextView passText = (TextView) findViewById(R.id.password_display);
     passText.setText(pass);
   }
}

Passage de données d’une activité à une autre

Maintenant, on aimerait bien faire passer les données saisies de la première vue à la deuxième et les afficher.
Pour cela, reprenons le code qui se trouve au dessus dans la classe “MainViewActivity.java”.
La méthode OnClick ressemblera à cela maintenant (On rajoute la récupération de données avant la création du Intent) :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//On récupère les deux champs, puis le texte saisi
EditText login = (EditText) findViewById(R.id.email);
String loginStr = login.getText().toString();
EditText pass = (EditText) findViewById(R.id.pass);
String passStr = pass.getText().toString();
 
Intent intent = new Intent(MainViewActivity.this,
                                     DisplayLoginActivity.class);
//On rajoute les valeurs à l’Intent
// en tant qu’extra a ce dernier.
// Les extras sont différenciés par un “id” (string)
intent.putExtra("login", loginStr);
intent.putExtra("password", passStr);
startActivity(intent);
Maintenant on va récupérer les données dans la classe DisplayLoginActivity, dans la méthode OnCreate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.login_display);
 //On récupère l’Intent que l’on a reçu
 Intent thisIntent = getIntent();
 //On récupère les deux extra grâce à leurs id
 String login = thisIntent.getExtras().getString("login");
 String pass = thisIntent.getExtras().getString("password");
 
 //On récupère les champs et on leur affecte le texte
 TextView loginText = (TextView) findViewById(R.id.email_display);
 loginText.setText(login);
 
 TextView passText = (TextView) findViewById(R.id.password_display);
 passText.setText(pass);
}
Donc ici, en lançant l’application, vous devriez obtenir les deux écrans suivants :

Gestion des erreurs

On aimerait gérer quelques erreurs quand l’utilisateur clique sur le bouton “Se Connecter” :
  • Le cas des champs Vides.
  • Adresse mail ne correspondant pas au format d’une adresse mail.
Pour cela nous allons modifier le fichier “MainViewActivity’. Nous allons rajouter des tests dans la méthode “onClick” après la récupération du login et du mot de passe.
  • Pour tester si l’adresse mail ne correspond pas au format d’une adresse mail :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//On déclare le pattern que l’on doit suivre
Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
//On déclare un matcher, qui comparera le pattern avec la string passée en argument
Matcher m = p.matcher(loginStr);
// Si l’adresse mail saisie ne correspond au format d’une adresse mail
if (m.matches() == false)
{
 //Toast est une classe fournie par le SDK Android
 //pour afficher les messages dans des minis pop up
 //Le premier argument est le Context, puis
 //le message et à la fin la durée de ce dernier
 Toast.makeText(getBaseContext(),
"Le champs email ne correspond pas au format d'une adresse mail",
Toast.LENGTH_SHORT).show();
 return;
}
  • Puis le cas des différents champs qui ne doivent pas être vides. On rajoute tout simplement le code suivant :
1
2
3
4
5
6
7
8
//Si un des deux champs est vide, alors on affiche les erreurs
if (passStr.equals("") || loginStr.equals(""))
{
 Toast.makeText(getBaseContext(),
"L'adresse email et mot de passe sont obligatoires",
Toast.LENGTH_SHORT).show();
 return;
}

Conclusion

Voila, ce tutoriel se termine ici. En espérant qu’il vous a aidé à mieux comprendre comment fonctionne les activités et les vues sous Android ainsi que comment gérer le passage de données entre deux vues. N’hésitez pas à commenter ou poser vos questions si vous avez des questions.

0 commentaires:

Enregistrer un commentaire

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free Android website | Bloggerized by wassim El mririe - Ramzi Essid | TO Best Web Host