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 :
Intent
Bundle
- 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 classeMyFragment
. - 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
à uneactivité
. - Comment passer des données entre
fragment
etactivity
en utilisant des intents. - Comment effectuer une FragmentTransaction ?
- Remplacer onResume() et recevoir des données dans android.
- Comment travailler à la fois avec
fragment
etactivity
.
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
, lanceuractivity
. - 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 étendonsandroid.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 :
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
- Tout d’abord, créez un nouveau projet dans android studio. Allez dans Fichier –> Nouveau Projet.
- Tapez le nom de l’application et choisissez le nom de la société.
- Choisissez le SDK minimum.
- Choisissez Empty ou Basic
activity
. - 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 notrefragment
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 :
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 secondeactivité
.
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 :
Téléchargement
Téléchargez le code ici.