Comment transférer une variable d'un fragment à une activité dans Android?

Une histoire sur la façon dont dans Android pour transférer des informations d'un fragment (Fragment) à une activité (Activity). Les informations seront utiles pour les débutants (juniors), maîtrisant la programmation pour Android, et ne devraient pas être intéressantes pour les intermédiaires et les seniors.

Lancez l'IDE (environnement de développement intégré) Android Studio . Créez un nouveau projet: Fichier -> Nouveau -> Nouveau projet. Sélectionnez "Activité vide", cliquez sur "Suivant".



Remplissez les champs «Nom», «Nom du package», «Enregistrer l'emplacement».



L'EDI créera automatiquement deux fichiers: «MainActivity.java» dans le répertoire «java / [nom du package]», «activity_main.xml» dans le répertoire «res / layout».





Le fichier Java détermine ce que fait l'application, xml - à quoi elle ressemble . Il fait jusqu'à présent très peu, seulement "setContentView (R.layout.activity_main);". Cette ligne indique à l'application d'utiliser la disposition activity_main.xml au démarrage. Et, comme la mise en page ne contient qu'un seul widget de type "TextView" avec le texte "Hello World!", Notre application a également l'air très modeste.



Dans le dossier du projet, créez un fragment avec le nom "Fragment1".





L'IDE va ​​créer deux fichiers: "Fragment1" et "fragment_fragment1.xml".





Ouvrez le fichier de disposition des fragments et supprimez le widget "TextView" dont nous n'avons pas besoin avec une ligne de bienvenue.



Passez en mode conception et faites glisser le bouton (Bouton) sur la mise en page.



L'IDE va ​​créer un bouton avec l'identifiant "bouton1".



Modifiez maintenant la disposition de l'activité principale, c'est-à-dire fichier "activity_main.xml"



Déplacez le widget texte plus haut et ajoutez le fragment que nous avons créé à la mise en page (pour ce faire, faites glisser l'élément "<>" sur la mise en page, sélectionnez "Fragment1" et cliquez sur "OK").



Dans la disposition des activités dans les paramètres du fragment, définissez layout_height = "wrap_content" et modifiez son emplacement à votre goût. Nous changerons également l'identifiant du champ de texte en «textReport» et le fragment en «fragmentWithButton».



Exécutez l'émulateur (Shift + F10) et voyez ce qui s'est passé.



L'application affiche l'inscription "Hello World!" et le bouton BOUTON. L'inscription est déduite de l' activité , le bouton appartient à un fragment . Le bouton est enfoncé, mais jusqu'à présent, il n'a aucun effet. Essayons de programmer l'inscription pour afficher le nombre d'appuis sur les boutons. Pour ce faire, nous devrons envoyer un message sur le clic du bouton du fragment à l'activité .

Tout d'abord, nous allons apprendre au fragment à compter le nombre de clics sur les boutons. Ouvrez le fichier «Fragment1.java».



Ajoutez la variable "compteur". Dans la méthode «onCreateView», qui est appelée immédiatement après la création du fragment, créez le bouton «écouteur». L'IDE nécessitera l'implémentation de View.OnClickListener - d'accord (Alt + Entrée). Créons (redéfinissons) la méthode onClick, qui augmentera la valeur de la variable «compteur» à chaque clic du bouton et affichera un message pop-up.



Vérifions dans l'émulateur (encore une fois Shift + F10) comment cela fonctionne. En appuyant sur le bouton, le message contextuel "Nombre de clics sur le bouton: ..." apparaîtra en bas de l'écran de l'application.



Super, continue. Notre objectif principal est de transférer des informations (dans ce cas, le nombre de clics sur les boutons) de l'instance de fragment vers l'instance d'activité. Hélas, les cycles de vie des activités et des fragments sont organisés de manière à ce qu'Android (presque) ne permette pas à l'activité et à un fragment de communiquer directement, nous avons donc besoin d'une interface intermédiaire. Appelons-le «facteur» (facteur). L'interface peut être créée soit dans un fichier séparé, soit dans un fichier avec un code de fragment; nous choisirons la première option. Notre interface Postman contiendra une seule méthode abstraite (sans "corps") de "fragmentMail".



Nous utiliserons la variable "numberOfClicks" comme "enveloppe" pour transférer les messages du fragment vers l'activité.

Ouvrez le fichier avec le code d'activité "MainActivity.java". Comme nous nous en souvenons, cela ressemble à ceci:



Nous implémentons l'interface Postman et ajoutons la méthode d'interface fragmentMail à l'activité, en la redéfinissant ( Override ).



Maintenant, dès que l'activité "voit" une nouvelle valeur dans la variable "numberOfClicks", elle affichera un message mis à jour dans le champ de texte textReport.

Mais nous devons encore «mettre la lettre dans l'enveloppe», c'est-à-dire passez à la variable le nombre de clics sur le bouton. Et nous le faisons dans le code de fragment. Ouvrez le fichier "Fragment1.java".

D̶o̶b̶a̶v̶l̶ya̶e̶m̶ ¯V Podpis Klassa ̶i̶m̶p̶l̶e̶m̶e̶n̶t̶a̶ts̶i̶yu̶ ̶i̶n̶t̶e̶r̶f̶e̶y̶s̶a̶ ̶ «Postman». Ide ̶p̶o̶t̶r̶e̶b̶u̶e̶t̶ ̶p̶e̶r̶e̶o̶p̶r̶e̶d̶e̶l̶i̶t̶̶ Metod ̶i̶n̶t̶e̶r̶f̶e̶y̶s̶a̶ ̶ «̶f̶r̶a̶g̶m̶e̶n̶t̶M̶a̶i̶l̶» ̶, ̶ Nô delat ¯V Nominal nichego Mỹ nè budem, ̶ ̶p̶o̶e̶t̶o̶m̶u̶ ̶o̶s̶t̶a̶v̶i̶m̶ EGO Telo ̶p̶u̶s̶t̶y̶m̶. [Supprimé, voir «Note 1 du 20/04/2019»]

Nous aurons besoin d'un lien vers une instance d'activité. Nous l'obtiendrons lorsqu'un fragment est attaché à une activité comme celle-ci:


Dans la méthode «onClick» (la même que celle qui est appelée lorsque le bouton de notre fragment est cliqué), nous ajoutons un appel à l'interface à partir d'une instance d'activité.



Le code final du fragment après la suppression (pour des raisons de compacité) des commentaires ressemble à ceci:


Maintenant, notre fragment compte le nombre de clics sur les boutons , les affiche dans un message contextuel, puis utilise l'interface Postman pour transférer la valeur de la variable de compteur à la variable numberOfClicks , qui sert de conteneur d'enveloppe pour envoyer des messages du fragment à l'activité. L'activité, recevant un nouveau message, l'affiche immédiatement dans son champ de texte de widget avec l'identifiant "textReport". Le but est atteint!


PS: Changer le langage de programmation de Java à Kotlin peut réduire considérablement le fragment de code:



PPS: Téléchargez les fichiers du projet ici: Java , Kotlin .

Note 1 du 20/04/2019:


L'implémentation de l'interface Postman a été supprimée du code de fragment.
Un fragment fonctionne avec une interface via une activité dans laquelle cette interface est déjà implémentée.
Merci à mikaakim pour ses commentaires .
Les fichiers mis à jour peuvent être téléchargés depuis github sur les liens ci-dessus.

Source: https://habr.com/ru/post/fr448744/


All Articles