startActivityForResult () à partir d’une activité enfant Fragment et finition, n’appelle pas onActivityResult () dans Fragment

FirstActivity.Java a un FragmentA.Java qui appelle startActivityForResult() . SecondActivity.Java call finish() mais onActivityResult ne onActivityResult jamais appelé, ce qui est écrit dans FragmentA.Java .

Code FragmentA.Java :

  @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // some code Intent i = new Intent(getActivity(), SecondActivity.class); i.putExtra("helloSsortingng", helloSsortingng); getActivity().startActivityForResult(i, 1); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); getActivity(); if(requestCode == 1 && resultCode == Activity.RESULT_OK) { //some code } } 

Code SecondActivity.Java :

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //some code Intent returnIntent = new Intent(); returnIntent.putExtra("result", result); setResult(Activity.RESULT_OK,returnIntent); finish(); } 

J’ai essayé de déboguer le code, mais onAcitvityResult() n’est jamais appelé.

Vous devez écrire onActivityResult() dans votre FirstActivity.Java comme suit

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } 

Donc, cela appellera onActivityResult() votre fragment

Edit: la solution consiste à remplacer getActivity().startActivityForResult(i, 1); avec startActivityForResult(i, 1);

La réponse de Kevin fonctionne, mais il est difficile de jouer avec les données en utilisant cette solution.

La meilleure solution est de ne pas démarrer startActivityForResult() au niveau de l’activité.

dans votre cas, n’appelez pas getActivity().startActivityForResult(i, 1);

Au lieu de cela, utilisez simplement startActivityForResult() et cela fonctionnera parfaitement! 🙂

Vous devez écrire onActivityResult () dans votre FirstActivity.Java comme suit

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { for (Fragment fragment : getChildFragmentManager().getFragments()) { fragment.onActivityResult(requestCode, resultCode, data); } } 

Cela déclenchera la méthode onActivityResult des fragments sur FirstActivity.java

Le fragment a déjà startActivityForResult , qui appellerait onActivityResult dans le fragment si vous l’utilisez, au lieu de getActivity()

La chose la plus importante, qui manque à tous ici, c’est que le mode de lancement de FirstActivity doit être singleTop. S’il s’agit de singleInstance, onActivityResult dans FragmentA sera appelé juste après avoir appelé la méthode startActivityForResult. Donc, il ne faudra pas attendre pour appeler la méthode finish () dans SecondActivity.

Donc, passez par les étapes suivantes, cela fonctionnera certainement car cela a fonctionné pour moi aussi après une longue recherche.

Dans le fichier AndroidManifest.xml, définissez launchMode de FirstActivity.Java sur singleTop.

  

Dans FirstActivity.java, substituez la méthode onActivityResult. Comme cela appellera onActivityResult de FragmentA.

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } 

Dans FragmentA.Java, substituez la méthode onActivityResult

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d("FragmentA.java","onActivityResult called"); } 

Appelez startActivityForResult(intent, HOMEWORK_POST_ACTIVITY); de FragmentA.Java

Call finish(); méthode dans SecondActivity.java

J’espère que ça va marcher.

onActivityResult () de MAinActivity appellera, onActivityResult () de Fragement ne sera pas appelé parce que fragment est placé dans Activity, donc évidemment il retourne à MainActivity

Nous pourrions appeler startActivityForResult() directement à partir de Fragment So Vous devriez appeler this.startActivityForResult(i, 1); au lieu de getActivity().startActivityForResult(i, 1);

 Intent i = new Intent(getActivity(), SecondActivity.class); i.putExtra("helloSsortingng", helloSsortingng); this.startActivityForResult(i, 1); 

Activité enverra le résultat de l’activité à votre fragment.

onCreate() pas finish() dans la méthode onCreate() alors ça marche bien.

appelez votre onActivityresult() dans ParentActivity.