Passer des données entre Activités

smartphobe_tools_2

Changer d’activité

Afin de changer d’écran, ou plus précisément d’Activité, il suffit de créer un Intent.

Un intent va pointer vers une nouvelle activité, identifiée par sa Class (ex: DetailActivity.class).

Nous pourrons ensuite demander au système d’exécuter cet intent avec la commande startActivity(intent)

Intent intent = new Intent(CONTEXT,ACTIVITE_DESTINATION.class);
startActivity(intent);
Intent intent = new Intent(this,DetailActivity.class);
startActivity(intent);

Il faut cependant penser à déclarer nos activités dans le fichier AndroidManifest, de la façon suivante :

AndroidManifest.xml

<activity
    android:name=".DetailActivity"
    android:label="@string/nom_ecran"/>

Exemple complet :

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tutosandroidfrance.test" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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=".DetailActivity"
	    	android:label="@string/nom_ecran"/>

    </application>

</manifest>

 

Passer des données

Pour transmettre des données entre nos activités, il faut les passer en temps qu’EXTRA à notre intent, c’est aussi facile à utiliser qu’une MAP, il suffit d’attacher une clé et une valeur.

intent.putExtra("CLE",VALEUR);

Nous pouvons passer tous types primitifs : Boolean, Integer, String, Float, Double, Long.

Intent intent = new Intent(this,DetailActivity.class);
intent.putExtra("name","Florent");
intent.putExtra("age",24);
startActivity(intent);

Nous pourrons ensuite récupérer cet extra à partir de l’activité ouverte, avec la fonction getIntent().getTYPEExtras(), par exemple :

 getIntent().getIntExtra("age",0)

0 étant ici la valeur par défaut à retourner dans le cas où “age” n’ait pas été transmit lors de la création de l’activité.

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    String name = intent.getStringExtra("name",null); //"florent
    int age = intent.getIntExtra("age",0); //24
}

Passer des données complexes

Comme vous avez pu le voir précédement, seul les types primitifs sont acceptés en tant qu’Extra d’un intent, mais comment faire lorsque l’on veux transmettre un objet, par exemple un User ?

Serializable

Première façon, la plus simple mais aussi la plus gourmande : passer nos objets en tant que Serializable. Le prinicpal avantage est la facilité avec laquelle nous le mettons en place, en effet il suffit que notre objet, ainsi que toutes ses propriétés soit Serializable (ou primitives).

Il suffit pour cela d’implémenter java.io.Serializable

public class User implements Serializable{
    int age;
    String name;
    ArrayList<String> nicknames;
    ...
}

Puis vous pourrez ensuite l’ajouter en tant qu’extra à votre nouvelle activité.

User user = new User(...);

Intent intent = new Intent(this,DetailActivity.class);
intent.putExtra("user",user);
startActivity(intent);

Et le récupérer en tant que Serializable

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    User user = (User)intent.getSerializableExtra("user");
}

Parcelable

Cette deuxième option, bien meilleur en terme de performance que les Serializables n’et pas beaucoup plus complexe à mettre en place. Ici nous allons demander à notre objet d’être Parcelable (qu’on pourrait traduire en français en “Empaquetté”).

Première étape, implémenter Parcelable

public class User implements Parcelable{
    int age;
    String name;
    ArrayList<String> nicknames;
    ...
}

Ce qui implique de remplir les fonctions suivantes : describeContents() et writeToParcel(Parcel out, int flags).
Dans describeContents nous retournerons 0, puis dans writeToParcel nous allons placer nos propriétés 1 à 1 à la même façon qu’un intent.putExtra()

public class User implements Parcelable{
    int age;
    String name;
    ArrayList<String> nicknames;
    ...

    @Override
    public int describeContents() {
         return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
         out.writeInt(age);
         out.writeString(name);
         out.writeList(nicknames);
    }
}

Nous devons ensuite créer un Parcelable.CREATOR, qui va se charger de la création d’un User depuis un parcel. Il va être déclaré en static final Parcelable.Creator<CLASSE> CREATOR à l’intérieur de notre Parcelable. Puis n’oublions pas un constructeur de notre objet qui va prendre en entrée un Parcel, pour se construire avec les données que nous avons écrit auparavant.

Penser à écrire et lire les données dans le même ordre !

public class User implements Parcelable{
    int age;
    String name;
    ArrayList<String> nicknames;
    ...

    @Override
    public int describeContents() {
         return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
         out.writeInt(age);
         out.writeString(name);
         out.writeList(nicknames);
    }

    public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        public User[] newArray(int size) {
            return new User[size];
        }
    };

    private User(Parcel in) {
        age = in.readInt();
        name = in.readString();

        nicknames = new ArrayList<>();
        in.readList(nicknames,null);
    }
}

Vous pourrez ensuite l’ajouter en tant qu’extra à votre nouvelle activité.

User user = new User(...);

Intent intent = new Intent(this,DetailActivity.class);
intent.putExtra("user",user);
startActivity(intent);

Et le récupérer en tant que Parcelable

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    User user = (User)intent.getParcelableExtra("user");
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *