J'ai deux activités: l'activité principale et l'activité enfant.
Lorsque j'appuie sur un bouton de l'activité principale, l'activité enfant est lancée.
Maintenant, je veux renvoyer des données à l'écran principal. J'ai utilisé la classe Bundle, mais cela ne fonctionne pas. Il lève quelques exceptions d'exécution.
Existe-t-il une solution à ça?
android
android-intent
Rajapandian
la source
la source
Réponses:
Il existe plusieurs façons de réaliser ce que vous voulez, selon les circonstances.
Le scénario le plus courant (à quoi ressemble le vôtre) est lorsqu'une activité enfant est utilisée pour obtenir une entrée utilisateur - comme choisir un contact dans une liste ou entrer des données dans une boîte de dialogue. Dans ce cas, vous devez utiliser
startActivityForResult
pour lancer votre activité enfant.Cela fournit un pipeline pour renvoyer des données à l'activité principale en utilisant
setResult
. La méthode setResult prend une valeur de résultat int et une intention qui est renvoyée à l'activité appelante.Pour accéder aux données renvoyées dans le remplacement d'activité appelant
onActivityResult
. Le requestCode correspond à l'entier transmis dans l'startActivityForResult
appel, tandis que le resultCode et les données Intent sont renvoyés par l'activité enfant.la source
startActivityForResult
fonction au lieu de simplementstartActivity
. Un exemple pourrait êtrestartActivityForResult(myIntent, 2);
où 2 est le code de résultat, qui peut prendre la place deMY_CHILD_ACTIVITY
dans l'instruction switch ci-dessus.L'activité 1 utilise startActivityForResult :
L'activité 2 est lancée et vous pouvez effectuer l'opération, pour fermer l'activité, procédez comme suit:
Activité 1 - le retour de l'activité précédente appellera onActivityResult :
MISE À JOUR: réponse au commentaire de Seenu69, dans l'activité deux,
Puis dans l'activité un,
la source
Renvoyer des données
Cela m'aide à voir les choses dans leur contexte. Voici un projet simple et complet pour renvoyer des données. Plutôt que de fournir les fichiers de mise en page XML, voici une image.
Activité principale
startActivityForResult
, en lui fournissant un code de résultat arbitraire.onActivityResult
. Ceci est appelé lorsque la deuxième activité se termine. Vous pouvez vous assurer qu'il s'agit bien de la deuxième activité en vérifiant le code de demande. (Ceci est utile lorsque vous lancez plusieurs activités différentes à partir de la même activité principale.)Intent
. Les données sont extraites à l'aide d'une paire clé-valeur.MainActivity.java
Deuxième activité
Intent
. Les données sont stockées dans à l'Intent
aide d'une paire clé-valeur.RESULT_OK
et ajoutez l'intention de conserver vos données.finish()
pour fermer la deuxième activité.SecondActivity.java
Autres notes
RESULT_OK
. Il suffit d' utiliser le nom complet:Activity.RESULT_OK
.Voir également
la source
FirstActivity utilise startActivityForResult:
Sur SecondActivity, appelez setResult () aux événements onClick ou onBackPressed ()
la source
Appelez l'activité enfant Intent à l'aide de l'appel de méthode startActivityForResult ()
Il y a un exemple de ceci ici: http://developer.android.com/training/notepad/notepad-ex2.html
et dans le "Retour d'un résultat à partir d'un écran" de ceci: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
la source
J'ai créé une classe de démonstration simple pour votre meilleure référence.
la source
Dans la première activité, vous pouvez envoyer l'intention en utilisant
startActivityForResult()
, puis obtenir le résultat de la deuxième activité après avoir terminé l'utilisationsetResult
.MainActivity.class
SecondActivity.class
la source
Toutes ces réponses expliquent que le scénario de votre deuxième activité doit être terminé après l'envoi des données.
Mais si vous ne souhaitez pas terminer la deuxième activité et que vous souhaitez renvoyer les données en premier, vous pouvez utiliser BroadCastReceiver.
Dans la deuxième activité -
Dans la première activité-
Enregistrez le récepteur dans onCreate () -
Désinscrivez-le dans onDestroy ()
la source
Une autre façon d'atteindre le résultat souhaité qui peut être meilleur selon votre situation est de créer une interface d'écoute.
En faisant écouter l'activité parent à une interface déclenchée par l'activité enfant tout en transmettant les données requises en tant que paramètre, vous pouvez créer un ensemble de circonstances similaire
la source
Il y a plusieurs façons de procéder. 1. en utilisant startActivityForResult () qui est très bien expliqué dans les réponses ci-dessus.
en créant les variables statiques dans votre classe "Utils" ou toute autre classe de votre choix. Par exemple, je veux passer studentId de ActivityB à ActivityA. Tout d'abord, mon ActivityA appelle ActivityB. Ensuite, dans ActivityB, définissez studentId (qui est un champ statique dans Utils.class). Comme ceci Utils.STUDENT_ID = "1234"; puis en revenant à l'ActivitéA, utilisez le studentId qui est stocké dans Utils.STUDENT_ID.
en créant une méthode getter et setter dans votre classe d'application.
comme ça:
vous avez donc terminé. définissez simplement les données à l'intérieur lorsque vous êtes dans ActivityB et après être revenu à ActivityA, récupérez les données.
la source
Juste un petit détail qui, je pense, manque dans les réponses ci-dessus.
Si votre activité enfant peut être ouverte à partir de plusieurs activités parentales, vous pouvez vérifier si vous devez le faire
setResult
ou non, selon que votre activité a été ouverte parstartActivity
oustartActivityForResult
. Vous pouvez y parvenir en utilisantgetCallingActivity()
. Plus d'infos ici .la source
Utilisez sharedPreferences et enregistrez vos données et accédez-y depuis n'importe où dans l'application
enregistrer la date comme ça
Et recevoir des données comme celle-ci
la source