Dans mon activité, j'appelle une deuxième activité de l'activité principale par startActivityForResult
. Dans ma deuxième activité, il existe certaines méthodes qui terminent cette activité (peut-être sans résultat), mais une seule d'entre elles renvoie un résultat.
Par exemple, à partir de l'activité principale, j'appelle une deuxième. Dans cette activité, je vérifie certaines fonctionnalités du combiné, telles que l'appareil photo. Si ce n'est pas le cas, je ferme cette activité. De plus, lors de la préparation MediaRecorder
ou en MediaPlayer
cas de problème, je terminerai cette activité.
Si son appareil dispose d'une caméra et que l'enregistrement est terminé, après l'enregistrement d'une vidéo, si un utilisateur clique sur le bouton Terminé, je renvoie le résultat (adresse de la vidéo enregistrée) à l'activité principale.
Comment vérifier le résultat de l'activité principale?
Réponses:
Depuis votre
FirstActivity
appel, la méthodeSecondActivity
usingstartActivityForResult()
Par exemple:
Dans votre
SecondActivity
ensemble, les données auxquelles vous souhaitez revenirFirstActivity
. Si vous ne voulez pas revenir en arrière, n'en définissez pas.Par exemple:
SecondActivity
Si vous souhaitez renvoyer des données:Si vous ne souhaitez pas renvoyer de données:
Maintenant, dans votre
FirstActivity
classe, écrivez le code suivant pour laonActivityResult()
méthode.Pour mettre en œuvre le transfert de données entre deux activités de manière bien meilleure dans Kotlin, veuillez consulter ce lien « Une meilleure façon de transmettre des données entre les activités »
la source
SecondActivity
une exception, une exception se soit produite, dans ce cas, vous devez également renvoyer le résultat à laFirstActivity
, afin que vous puissiez définir le résultat comme"RESULT_CANCELLED"
dans le bloc catch et revenir àFirstActivty
et dans etFirstActivity's' 'onActivityResult()
vous pouvez vérifier si vous avez obtenu le résultat de réussite ou d'échec.Vous devez remplacer
Activity.onActivityResult()
puis vérifier ses paramètres:requestCode
identifie l'application qui a renvoyé ces résultats. Ceci est défini par vous lorsque vous appelezstartActivityForResult()
.resultCode
vous informe si cette application a réussi, échoué ou quelque chose de différentdata
détient toutes les informations retournées par cette application. C'est possiblenull
.la source
En complément de la réponse de @ Nishant, la meilleure façon de renvoyer le résultat de l'activité est:
J'avais des problèmes avec
Ensuite, j'ai découvert que la bonne façon utilise
pour obtenir l'intention actuelle
la source
Intent
qui n'existe que pour contenir unBundle
et qui n'a pas les valeurs normales comme une action ou un composant. Mais il semble également un peu étrange (et potentiellement dangereux?) De modifier celuiIntent
qui a été utilisé pour lancer l'activité en cours. J'ai donc recherché la source pour Android lui-même et j'ai constaté qu'ils en créaient toujours un nouveauIntent
à utiliser. Par exemple, github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
semblent être un moyen idéal pour renvoyer des données à une activité inconnue, d'où l'activité a été appelée. Merci!Exemple
Pour voir l'ensemble du processus dans son contexte, voici une réponse supplémentaire. Voir ma réponse plus complète pour plus d'explications.
MainActivity.java
SecondActivity.java
la source
Pour ceux qui ont un problème avec un mauvais requestCode dans onActivityResult
Si vous appelez
startActivityForResult()
depuis votreFragment
, le requestCode est modifié par l'activité qui possède le fragment.Si vous voulez obtenir le bon code de résultat dans votre activité, essayez ceci:
Changement:
startActivityForResult(intent, 1);
À:getActivity().startActivityForResult(intent, 1);
la source
Si vous souhaitez mettre à jour l'interface utilisateur avec le résultat de l'activité, vous ne pouvez pas utiliser. En
this.runOnUiThread(new Runnable() {}
procédant ainsi, l'interface utilisateur ne sera pas actualisée avec une nouvelle valeur. Au lieu de cela, vous pouvez le faire:Cela semble idiot mais fonctionne plutôt bien.
la source
D'abord, vous utilisez
startActivityForResult()
avec les paramètres en premierActivity
et si vous souhaitez envoyer des données du deuxièmeActivity
au premier,Activity
passez la valeur à l'aideIntent
de lasetResult()
méthode et récupérez ces données à l'intérieur de laonActivityResult()
méthode en premierActivity
.la source
Problème très courant dans Android
Il peut être décomposé en 3 morceaux
1) démarrer l'activité B (se produit dans l'activité A)
2) Définir les données demandées (se produit dans l'activité B)
3) Recevoir les données demandées (se produit dans l'activité A)
Dans cette partie, vous décidez si vous souhaitez renvoyer des données ou non lorsqu'un événement particulier se produit.
Par exemple: Dans l'activité B, il y a un EditText et deux boutons b1, b2.
Cliquer sur le bouton b1 renvoie les données à l'activité A
Cliquer sur le bouton b2 n'envoie aucune donnée.
Envoi de données
Ne pas envoyer de données
l'utilisateur clique sur le bouton de retour
Par défaut, le résultat est défini avec le code de réponse Activity.RESULT_CANCEL
Pour ce remplacement, méthode onActivityResult
la source
ActivityResultRegistry est l'approche recommandée
ComponentActivity
fournit maintenant unActivityResultRegistry
qui vous permet de gérer lestartActivityForResult()
+onActivityResult()
ainsi querequestPermissions()
+onRequestPermissionsResult()
flux sans écraser les méthodes dans votreActivity
ouFragment
, apporte la sécurité de type augmenté parActivityResultContract
et fournit des crochets pour tester ces flux.Il est fortement recommandé d'utiliser les API Activity Result introduites dans AndroidX Activity 1.2.0-alpha02 et Fragment 1.3.0-alpha02.
Ajoutez ceci à votre
build.gradle
Comment utiliser le contrat pré-construit?
Cette nouvelle API possède les fonctionnalités pré-construites suivantes
Un exemple qui utilise le contrat takePicture:
Alors qu'est-ce qui se passe ici? Décomposons-le légèrement.
takePicture
est juste un rappel qui retourne un bitmap nullable - que ce soit nul ou non dépend de laonActivityResult
réussite ou non du processus.prepareCall
puis enregistre cet appel dans une nouvelle fonctionnalitéComponentActivity
appeléeActivityResultRegistry
- nous y reviendrons plus tard.ActivityResultContracts.TakePicture()
est l'un des assistants intégrés que Google a créés pour nous, et enfin, l'invocationtakePicture
déclenche réellement l'intention de la même manière que vous le feriez précédemment avecActivity.startActivityForResult(intent, REQUEST_CODE)
.Comment rédiger un contrat personnalisé?
Contrat simple qui prend un Int comme entrée et renvoie une chaîne qui a demandé que l'activité retourne dans le résultat Intent.
Consultez cette documentation officielle pour plus d'informations.
la source
la source