Le passage de données entre des activités ou des fragments est l’un des concepts de base que vous devez apprendre lorsque vous commencez à faire du développement android. Même si les activités et les fragments ne sont rien d’autre que des classes, elles sont considérées comme des classes spéciales dans android car elles sont fondamentales pour le fonctionnement de l’interface utilisateur d’android. Ainsi, nous ne nous contentons pas de leur passer des données via les constructeurs mais de l’une des trois manières suivantes :

  1. Intent
  2. Bundle
  3. ViewModel

Nous allons examiner tous ces éléments à l’aide d’exemples pratiques dans cette leçon. Commençons.

Exemple 1 : Passage de données Android – Fragment vers Activity via Intent.

Nous avons vu comment passer des données de activity à fragment et comment passer une liste/objet de activity à activity ainsi que des types de données primitives simples.

Aujourd’hui, nous regardons comment passer des types de données simples du fragment à l’activity. Nous passons les données via l’objet Intent.

Qu’est-ce qu’un Fragment ?

Un fragment est une sous-activité avec son propre cycle de vie. Les fragments sont hébergés par des activités. Une activité peut héberger plusieurs fragments.

Pourquoi passer les données d’un Fragment à une Activité ?

No. Raison
Les fragments sont des sous-activités et nous permettent d’avoir des écrans différents sans avoir à créer plusieurs "activités". Par conséquent, nous devons savoir comment passer les données du fragment à une activité.
Les fragments tels que Activities sont des classes d’interface utilisateur spéciales représentant une fenêtre et nous ne pouvons donc pas passer les données directement comme nous le faisons avec les classes ordinaires.

Introduction

  • Nous avons deux classes : une classe MainActivity et une classe MyFragment.
  • Lorsque nous appuyons sur le bouton FAB (Floating Action Button), nous ouvrons le MyFragment via la transaction Fragment, l’attachant à un FrameLayout que nous allons définir.
  • Le Fragment contient un texte d’édition et un spinner.
  • L’utilisateur tape le nom du vaisseau spatial et choisit l’année de lancement dans la roue.
  • Nous passons ensuite ces deux données à MainActivity.
  • Puis nous affichons les données reçues dans des textviews.
  • Nous avons utilisé Android Studio comme IDE.
  • Le code est bien commenté pour une meilleure compréhension.

Questions courantes auxquelles nous répondons

Avec cet exemple simple, nous explorons les questions suivantes :

  • Comment passer des données de fragment à une activité.
  • Comment passer des données entre fragment et activity en utilisant des intents.
  • Comment effectuer une FragmentTransaction ?
  • Remplacer onResume() et recevoir des données dans android.
  • Comment travailler à la fois avec fragment et activity.

Outils utilisés

  • IDE : Android Studio
  • SYSTÈME D’EXPLOITATION : Windows 8.1
  • PLATEFORME : Android
  • LANGUE : Java
  • SUJET : Intent, Data Passing, Fragment.

Allons-y.

Jetons un coup d’oeil au code source.

1. Build.gradle

  • Pas de dépendances externes nécessaires.

2. MainActivity.java

  • Notre MainActivity, lanceur activity.
  • Tout d’abord, nous référençons des vues ici, dans ce cas de simples vues de texte pour afficher nos données reçues.
  • Nous avons une méthode : receiveData() qui est responsable de la réception et du dépaquetage des données que nous recevons de la classe MyFragment.
  • Nous recevrons les données dans la méthode onResume().
  • Comme cette méthode est appelée non seulement lorsque nous reprenons le fragment, mais aussi après que l’activité ait été créée et démarrée, nous devrons identifier l’appelant à l’aide d’une simple chaîne d’expéditeur que nous enverrons à chaque fois que nous enverrons des données depuis le fragment.
  • Si l’expéditeur est MonFragment ,alors nous allons de l’avant et déballons nos données.

package com.tutorials.hp.datafragment_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView nameTxt,yearTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    //REFERENCE VIEWS
        nameTxt= (TextView) findViewById(R.id.nameTxt);
        yearTxt= (TextView) findViewById(R.id.yearTxt);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              openFragment();
            }
        });
    }
/*
WHEN ACTIVITY RESUMES
*/
    @Override
    protected void onResume() {
        super.onResume();

    //DETERMINE WHO STARTED THIS ACTIVITY
    final String sender=this.getIntent().getExtras().getString("SENDER_KEY");

    //IF ITS THE FRAGMENT THEN RECEIVE DATA
        if(sender != null)
        {
            this.receiveData();
            Toast.makeText(this, "Received", Toast.LENGTH_SHORT).show();

        }
    }

    /*
        OPEN FRAGMENT
         */
    private void openFragment()
    {
        //PASS OVER THE BUNDLE TO OUR FRAGMENT
        MyFragment myFragment = new MyFragment();
        //THEN NOW SHOW OUR FRAGMENT
        getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
    }

    /*
    RECEIVE DATA FROM FRAGMENT
     */
    private void receiveData()
    {
        //RECEIVE DATA VIA INTENT
        Intent i = getIntent();
        String name = i.getStringExtra("NAME_KEY");
        int year = i.getIntExtra("YEAR_KEY",0);

        //SET DATA TO TEXTVIEWS
        nameTxt.setText(name);
        yearTxt.setText(String.valueOf(year));
    }
}

3. MonFragment.java

  • Notre classe Fragment.
  • Nous utilisons la librairie de support Fragment donc nous étendons android.support.v4.app.Fragment“.
  • Ici, nous avons un texte d’édition, un bouton et un spinner.
  • L’utilisateur doit entrer le nom de l’engin spatial dans le texte d’édition, sélectionner l’année de lancement dans la roue et cliquer sur le bouton d’envoi pour envoyer ces données à MainActivity.
  • Nous envoyons et emballons les données dans un intent.
  • Nous envoyons également une variable que nous appelons sender pour identifier l’expéditeur de ces données comme ce fragment.

package com.tutorials.hp.datafragment_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

/
 * A simple Fragment subclass.
 */
public class MyFragment extends Fragment {

    private EditText nameFragTxt;
    private Spinner launchYearSpinner;
    private Button sendBtn;

    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View rootView=inflater.inflate(R.layout.fragment_my, container, false);

        //INITIALIZE VIEWS
        nameFragTxt = (EditText)rootView.findViewById(R.id.nameEditTxt);
        launchYearSpinner = (Spinner)rootView.findViewById(R.id.sp);
        sendBtn = (Button) rootView.findViewById(R.id.sendBtn);

        fillYears();

        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendData();
            }
        });

        return rootView;
    }
    /*
    FILL YEARS IN OUR SPINNER
    */
    private void fillYears() {
        ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1);
        adapter.add("2017");
        adapter.add("2018");
        adapter.add("2019");
        adapter.add("2020");
        adapter.add("2021");
        adapter.add("2022");

        //SET ADAPTER INSTANCE TO OUR SPINNER
        launchYearSpinner.setAdapter(adapter);

    }

    private void sendData()
    {
        //INTENT OBJ
        Intent i = new Intent(getActivity().getBaseContext(),
                MainActivity.class);

        //PACK DATA
    i.putExtra("SENDER_KEY", "MyFragment");
        i.putExtra("NAME_KEY", nameFragTxt.getText().toString());
        i.putExtra("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));

        //RESET WIDGETS
        nameFragTxt.setText("");
        launchYearSpinner.setSelection(0);

        //START ACTIVITY
        getActivity().startActivity(i);
    }
}

4. Créer des interfaces utilisateur

Les interfaces utilisateur sont généralement créées dans android en utilisant des mises en page XML par opposition à un codage direct en java.

C’est un exemple de programmation déclarative.

Avantages de l’utilisation de XML par rapport à Java
No. Avantage
1. La création déclarative des widgets et des vues nous permet d’utiliser un langage déclaratif XML, ce qui est plus facile.
2. Il est facilement maintenable car l’interface utilisateur est découplée de votre logique Java.
3. Il est plus facile de partager ou de télécharger du code et de le tester en toute sécurité avant l’exécution.
4. Vous pouvez utiliser des outils de génération de XML pour générer du XML

Voici nos mises en page pour ce projet :

(a). activité_main.xml
  • Ce layout est gonflé en interface utilisateur MainActivity.
  • Il inclut le content_main.xml.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_fitsSystemWindows="true"
    tools_context="com.tutorials.hp.datafragment_activity.MainActivity">

    <android.support.design.widget.AppBarLayout
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android_id="@+id/toolbar"
            android_layout_width="match_parent"
            android_layout_height="?attr/actionBarSize"
            android_background="?attr/colorPrimary"
            app_popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android_id="@+id/fab"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="bottom|end"
        android_layout_margin="@dimen/fab_margin"
        app_srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

Voici quelques-uns des widgets, vues et groupes de vues qui sont employés"

No. View/ViewGroup Package Role
CordinatorLayout android.support.design.widget Un framelayout surpuissant qui fournit la décoration de haut niveau de notre application et spécifie également les interactions et le comportement de tous ses enfants.
Un enfant de LinearLayout qui dispose ses enfants verticalement et fournit des concepts de barre d’application Material Design comme les gestes de défilement.
3. ToolBar <android.support.v7.widget Un ViewGroup qui peut fournir des fonctionnalités de barre d’action tout en étant utilisé dans les dispositions d’application.
4. FloatingActionButton <android.support.design.widget Une image circulaire flottant au-dessus de l’interface utilisateur que nous pouvons utiliser comme boutons.
(b). content_main.xml

Ce layout est inclus dans votre activity_main.xml.
Nous définissons nos widgets d’interface utilisateur ici.

  • Mise en page principale.
  • Nous spécifions les vues et le code xml des widgets ici.
  • Ce layout sera gonflé dans notre interface MainActivity.
  • C’est le layout contentmain.xml de notre projet.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android_id="@+id/content_main"
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_paddingBottom="@dimen/activity_vertical_margin"
    android_paddingLeft="@dimen/activity_horizontal_margin"
    android_paddingRight="@dimen/activity_horizontal_margin"
    android_paddingTop="@dimen/activity_vertical_margin"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.datafragment_activity.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="vertical"
        android_layout_height="match_parent">

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Received Data"
        android_id="@+id/activityTitle"
        android_textStyle="bold"
        android_textColor="@color/colorAccent"
        android_layout_gravity="center_horizontal"
        android_padding="5dp"
        />

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Name"
        android_id="@+id/nameTxt"
        android_padding="5dp"
        />

    <TextView
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_textAppearance="?android:attr/textAppearanceLarge"
        android_text="Year"
        android_id="@+id/yearTxt"
        android_padding="5dp"
        />

    <FrameLayout
        android_id="@+id/container"
        android_layout_width="match_parent"
        android_layout_height="wrap_content">

    </FrameLayout>

    </LinearLayout>
</RelativeLayout>

(c). Mise en page de MyFragment

  • Layout pour notre classe Fragment.
  • Contient un CardView avec un edittext et un spinner.
  • Est le layout fragment_my.xml de notre projet.

<FrameLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.datafragment_activity.MyFragment">
    <android.support.v7.widget.CardView
        android_orientation="horizontal"
        android_layout_width="match_parent"

        android_layout_margin="5dp"
        card_view_cardCornerRadius="10dp"
        card_view_cardElevation="5dp"
        android_layout_height="300dp">

        <LinearLayout
            android_orientation="vertical"
            android_layout_width="match_parent"
            android_layout_height="match_parent">
            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="FRAGMENT ONE"
                android_id="@+id/fragTitle"
                android_textStyle="bold"
                android_textColor="@color/colorAccent"
                android_layout_gravity="center_horizontal"
                android_padding="5dp"
                />

            <android.support.design.widget.TextInputLayout
                android_id="@+id/nameLayout"
                android_layout_width="match_parent"
                android_layout_height="wrap_content">

                <EditText
                    android_id="@+id/nameEditTxt"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    android_singleLine="true"
                    android_hint= "Name" />
            </android.support.design.widget.TextInputLayout>

            <LinearLayout
                android_layout_width="match_parent"
                android_orientation="horizontal"
                android_layout_height="wrap_content">
                <TextView
                    android_text="LAUNCH YEAR : "
                    android_textColor="@color/colorAccent"
                    android_layout_width="wrap_content"
                    android_layout_height="wrap_content" />
                <Spinner
                    android_id="@+id/sp"
                    android_layout_width="match_parent"
                    android_layout_height="wrap_content"
                    />
            </LinearLayout>

            <Button
                android_id="@+id/sendBtn"
        android_text="Send"
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"             />
        </LinearLayout>
    </android.support.v7.widget.CardView>
</FrameLayout>

Comment exécuter

  • Téléchargez le projet ci-dessus.
  • Vous obtiendrez un fichier zippé, extrayez-le.
  • Ouvrez le Android Studio.
  • Fermez maintenant, tout projet déjà ouvert
  • Dans la barre de menu, cliquez sur Fichier >Nouveau>Importer un projet.
  • Choisissez maintenant un dossier de destination, à partir duquel vous voulez importer le projet.
  • Choisissez un projet Android.
  • Cliquez maintenant sur "OK".
  • C’est fait, vous avez fini d’importer le projet, maintenant éditez-le.

Résultat

Voici ce que vous obtiendrez :

Comment passer les données du <code>fragment</code> à l'<code>activité</code>

Plus de ressources

Ressource Lien
GitHub Browse Browse
Lien de téléchargement GitHub Download

Exemple 2 : Passage des données Android – De Activity à Fragment via Bundle

Lorsque vous développez une application qui n’est pas un Hello World, il y a de fortes chances que vous ayez besoin de plus d’une Activity ou de plusieurs Fragments.

La plupart des débutants ne savent pas comment passer des données entre les Activités ou les Fragments.

Aujourd’hui, nous voulons voir comment passer des données d’une activité à un fragment. Nous allons utiliser un objet Bundle, y placer des données dans notre Activity, puis dépaqueter ces données dans la méthode onCreateView() de notre Fragment.

ETAPE 1 : Créer un projet

  1. Tout d’abord, créez un nouveau projet dans android studio. Allez dans Fichier –> Nouveau Projet.
  2. Tapez le nom de l’application et choisissez le nom de la société.
  3. Choisissez le SDK minimum.
  4. Choisissez Empty ou Basic activity.
  5. Cliquez sur Finish.

ETAPE 2 : Notre Build.gradle.

  • Nous allons utiliser un CardView dans notre Fragment. Aucune dépendance externe n’est nécessaire.

ETAPE 3 : Notre Fragment.

  • Nous allons gonfler le layout de notre fragment.
  • Nous recevrons simplement les données envoyées par MainActivity et les afficherons dans nos vues à l’intérieur de notre fragment.
  • Nous déballons les données dans notre méthode onCreateView().

package com.tutorials.hp.dataactivity_fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment {

    private TextView nameFragTxt,yearFragTxt;

    public MyFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView=inflater.inflate(R.layout.fragment_my, container, false);

        nameFragTxt= (TextView) rootView.findViewById(R.id.nameTxt);
        yearFragTxt= (TextView) rootView.findViewById(R.id.yearTxt);

        //UNPACK OUR DATA FROM OUR BUNDLE
        String name=this.getArguments().getString("NAME_KEY").toString();
        int year=this.getArguments().getInt("YEAR_KEY");

       nameFragTxt.setText("NAME : "+name);
       yearFragTxt.setText("YEAR : "+String.valueOf(year));

        return rootView;
    }

}

ETAPE 4 : Notre MainActivity

  • Doit être gonflé à partir de notre contentmain.xml.
  • Lorsque l’utilisateur clique sur le bouton d’action flottant, nous emballons les données tapées par l’utilisateur dans le edittext et le spinner dans un objet Bundle.
  • Nous effectuons ensuite notre transaction Fragment, en remplaçant notre conteneur Framelayout par notre fragment gonflé.
  • Nous envoyons le bundle au Fragment.

package com.tutorials.hp.dataactivity_fragment;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;

public class MainActivity extends AppCompatActivity {
    private EditText nameTxt;
    private Spinner launchYearSpinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //INITIALIZE VIEWS
        nameTxt = (EditText) findViewById(R.id.nameEditTxt);
        launchYearSpinner = (Spinner) findViewById(R.id.sp);

        fillYears();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendData();
            }
        });
    }

    /*
    SEND DATA TO FRAGMENT
     */
    private void sendData() {
        //PACK DATA IN A BUNDLE
        Bundle bundle = new Bundle();
        bundle.putString("NAME_KEY", nameTxt.getText().toString());
        bundle.putInt("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));

        //PASS OVER THE BUNDLE TO OUR FRAGMENT
        MyFragment myFragment = new MyFragment();
        myFragment.setArguments(bundle);

        nameTxt.setText("");
        launchYearSpinner.setSelection(0);

        //THEN NOW SHOW OUR FRAGMENT
        getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();

    }

    /*
    FILL YEARS IN OUR SPINNER
     */
    private void fillYears() {
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
        adapter.add("2017");
        adapter.add("2018");
        adapter.add("2019");
        adapter.add("2020");
        adapter.add("2021");
        adapter.add("2022");

        //SET ADAPTER INSTANCE TO OUR SPINNER
        launchYearSpinner.setAdapter(adapter);
    }
}

ETAPE 5. Création de l’interface utilisateur `Activity

Les interfaces utilisateur sont généralement créées dans android en utilisant des mises en page XML par opposition au codage direct en java.

C’est un exemple de programmation déclarative.

**Avantages de l’utilisation de XML par rapport à Java.

No. Avantage
1. La création déclarative des widgets et des vues nous permet d’utiliser un langage déclaratif, le XML, qui est plus facile.
2. Il est facilement maintenable car l’interface utilisateur est découplée de votre logique Java.
3. Il est plus facile de partager ou de télécharger du code et de le tester en toute sécurité avant l’exécution.
4. Vous pouvez utiliser des outils pour générer du XML

Voici nos mises en page pour ce projet :

(a). activité_main.xml
  • Ce layout est gonflé en interface utilisateur MainActivity.
  • Il inclut le content_main.xml.

Voici quelques-uns des widgets, vues et groupes de vues qui sont utilisés".

No. View/ViewGroup Package Role
1. CordinatorLayout android.support.design.widget Un framelayout surpuissant qui fournit la décoration de haut niveau de notre application et qui spécifie également les interactions et le comportement de tous ses enfants.
Un enfant de LinearLayout qui dispose ses enfants verticalement et fournit des concepts de barre d’application Material Design comme les gestes de défilement.
3. Un groupe de vues qui peut fournir des fonctionnalités de barre d’action tout en étant utilisé dans les dispositions d’application.
4. FloatingActionButton android.support.design.widget Une image circulaire flottant au-dessus de l’interface utilisateur que nous pouvons utiliser comme boutons.
(b). content_main.xml

Ce layout est inclus dans votre activity_main.xml.
Nous définissons nos widgets d’interface utilisateur ici.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_paddingBottom="@dimen/activity_vertical_margin"
    android_paddingLeft="@dimen/activity_horizontal_margin"
    android_paddingRight="@dimen/activity_horizontal_margin"
    android_paddingTop="@dimen/activity_vertical_margin"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.dataactivity_fragment.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="vertical"
        android_layout_height="match_parent">

        <android.support.design.widget.TextInputLayout
            android_id="@+id/nameLayout"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">

            <EditText
                android_id="@+id/nameEditTxt"
                android_layout_width="match_parent"
                android_layout_height="wrap_content"
                android_singleLine="true"
                android_hint= "Name" />
        </android.support.design.widget.TextInputLayout>

    <LinearLayout
        android_layout_width="match_parent"
        android_orientation="horizontal"
        android_layout_height="wrap_content">
        <TextView
            android_text="LAUNCH YEAR : "
            android_textColor="@color/colorAccent"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content" />
        <Spinner
            android_id="@+id/sp"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            />
        </LinearLayout>
        <FrameLayout
            android_id="@+id/container"
            android_layout_width="match_parent"
            android_layout_height="wrap_content">
        </FrameLayout>
    </LinearLayout>
</RelativeLayout>

ETAPE 6 : Notre Fragment xml

  • Notre layout fragment.
  • Doit contenir un CardView avec des textviews.

<RelativeLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.dataactivity_fragment.MyFragment">

    <android.support.v7.widget.CardView
        android_orientation="horizontal"
        android_layout_width="match_parent"

        android_layout_margin="5dp"
        card_view_cardCornerRadius="10dp"
        card_view_cardElevation="5dp"
        android_layout_height="300dp">

        <LinearLayout
            android_orientation="vertical"
            android_layout_width="match_parent"
            android_layout_height="match_parent">

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="FRAGMENT ONE"
                android_id="@+id/fragTitle"
                android_textStyle="bold"
                android_textColor="@color/colorAccent"
                android_layout_gravity="center_horizontal"
                android_padding="5dp"
                 />

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Name"
                android_id="@+id/nameTxt"
                android_padding="5dp"
                />

            <TextView
                android_layout_width="wrap_content"
                android_layout_height="wrap_content"
                android_textAppearance="?android:attr/textAppearanceLarge"
                android_text="Year"
                android_id="@+id/yearTxt"
                android_padding="5dp"
                />

        </LinearLayout>
    </android.support.v7.widget.CardView>

</RelativeLayout>

ETAPE 7 : Comment exécuter

  • Téléchargez le projet.
  • Vous obtiendrez un fichier zippé, extrayez-le.
  • Ouvrez le Android Studio.
  • Fermez maintenant, tout projet déjà ouvert
  • Dans la barre de menu, cliquez sur Fichier >Nouveau>Importer un projet.
  • Choisissez maintenant un dossier de destination, à partir duquel vous voulez importer le projet.
  • Choisissez un projet Android.
  • Cliquez maintenant sur "OK".
  • Terminé, maintenant modifiez-le..

Résultat

Voici ce que vous obtenez :

Comment passer des données de <code>Activity</code> à <code>Fragment</code>

ETAPE 8 : Plus

Ressource Lien
GitHub Browse Browse
Lien de téléchargement GitHub Download

Passage de données Android : ListView à ListView

Parfois, vous pouvez vouloir passer des données d’un ListView dans l’activité A à un ListView dans l’activité B. C’est le but de ce tutoriel.

Nous aurons deux activités, chacune avec une ListView. Nous cliquons sur un bouton et passons des données de la première activité à la seconde activité, de la première listview à la seconde listview.

Scripts Gradle

Modifions notre fichier build.gradle au niveau de l’application.

1. Build.gradle

  • Nous spécifions les dépendances sous la fermeture dependencies.

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.tutorials.hp.listviewdatapassing"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:25.2.0'
        compile 'com.android.support:design:25.2.0'
        testCompile 'junit:junit:4.12'
    }

LAYOUTS

Nous aurons trois mises en page :

1. activité_main.xml

  • Ce layout sera gonflé dans l’interface utilisateur de notre activité principale.
  • Il contiendra le layout content_main.xml.
  • Il contient nos définitions d’appbar et de toolbar.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout

        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_fitsSystemWindows="true"
        tools_context="com.tutorials.hp.listviewdatapassing.MainActivity">

        <android.support.design.widget.AppBarLayout
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android_id="@+id/toolbar"
                android_layout_width="match_parent"
                android_layout_height="?attr/actionBarSize"
                android_background="?attr/colorPrimary"
                app_popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <include layout="@layout/content_main" />

        <android.support.design.widget.FloatingActionButton
            android_id="@+id/fab"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_gravity="bottom|end"
            android_layout_margin="@dimen/fab_margin"
            app_srcCompat="@android:drawable/ic_dialog_email" />

    </android.support.design.widget.CoordinatorLayout>

2. contenu_main.xml

  • Il contiendra notre première ListView.
  • Ce layout est inclus à l’intérieur du activity_main.xml.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_id="@+id/content_main"
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        app_layout_behavior="@string/appbar_scrolling_view_behavior"
        tools_context="com.tutorials.hp.listviewdatapassing.MainActivity"
        tools_showIn="@layout/activity_main">

        <ListView
            android_id="@+id/firstLV"
            android_layout_width="match_parent"
            android_layout_height="wrap_content" />
    </RelativeLayout>

3. activité_second.xml

  • Ce layout sera gonflé dans l’interface utilisateur de notre deuxième activité.
  • Il contiendra la deuxième activité.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_id="@+id/activity_second"
        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        tools_context="com.tutorials.hp.listviewdatapassing.SecondActivity">
        <ListView
            android_id="@+id/secondLV"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            />
    </RelativeLayout>

CLASSES JAVA

Voici nos classes java :

1. SpacecraftsCollection

  • C’est une classe qui va nous aider à transférer notre ArrayList de la première à la seconde activité. Cette classe sera sérialisée, transférée puis désérialisée dans la seconde activité.

    package com.tutorials.hp.listviewdatapassing;

    import java.io.Serializable;
    import java.util.ArrayList;

    public class SpacecraftsCollection implements Serializable {

        private ArrayList<String> spacecrafts;

        public ArrayList<String> getSpacecrafts() {
            return spacecrafts;
        }

        public void setSpacecrafts(ArrayList<String> spacecrafts) {
            this.spacecrafts = spacecrafts;
        }
    }

2. SecondActivity.java

  • C’est notre deuxième classe activity.
  • Elle recevra un arraylist sérialisé contenant nos vaisseaux spatiaux et le désérialisera pour l’afficher dans le second listview.

    package com.tutorials.hp.listviewdatapassing;

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    public class SecondActivity extends AppCompatActivity {

        //SECOND LISTVIEW
        ListView lv;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);

            lv= (ListView) findViewById(R.id.secondLV);

            receiveData();
        }

        /*
        RECEIVE DATA FROM FIRST ACTIVITY
         */
        private void receiveData()
        {
            Intent i=this.getIntent();
            SpacecraftsCollection spacecraftsCollection= (SpacecraftsCollection) i.getSerializableExtra("SPACECRAFTS");

            lv.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,spacecraftsCollection.getSpacecrafts()));
        }
    }

3. MainActivity.java

  • Notre classe MainActivity.
  • Les données de notre tableau seront transférées d’ici à la deuxième activité lorsque le bouton d’action flottant est cliqué.

    package com.tutorials.hp.listviewdatapassing;

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity {

        //FIRST LISTVIEW
        ListView lv;
        ArrayList spacecrafts=new ArrayList();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            lv= (ListView) findViewById(R.id.firstLV);
            populateData();
            lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,spacecrafts));

            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>()));
                    sendData();
                }
            });
        }

        //POPULATE SPACECRAFTS ARRAYLIST
        private void populateData()
        {
            spacecrafts.add("Casini");
            spacecrafts.add("Enterprise");
            spacecrafts.add("Spitzer");
            spacecrafts.add("Huygens");
            spacecrafts.add("WMAP");
            spacecrafts.add("Juno");
            spacecrafts.add("Kepler");
            spacecrafts.add("Apollo 15");
            spacecrafts.add("Challenger");
            spacecrafts.add("Discovery");
        }

        /*
        SET ARRAYLIST TO SPACECRAFTS COLLECTION CLASS
         */
        private SpacecraftsCollection getData()
        {
            SpacecraftsCollection spacecraftsCollection=new SpacecraftsCollection();
            spacecraftsCollection.setSpacecrafts(spacecrafts);

            return spacecraftsCollection;
        }

        /*
        SEND DATA TO SECOND ACTIVITY
         */
        private void sendData()
        {
            Intent i=new Intent(this,SecondActivity.class);
            i.putExtra("SPACECRAFTS",this.getData());
            startActivity(i);
        }
    }

Résultat

Voici ce que vous obtenez lorsque vous exécutez le projet :

Comment passer les données d'un ListView à un ListView

Téléchargement

Téléchargez le code ici.