web-dev-qa-db-fra.com

startActivityForResult () depuis un fragment et une activité enfant de fin, n'appelle pas onActivityResult () dans Fragment

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

FragmentA.Java code:

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // some code
    Intent i = new Intent(getActivity(), SecondActivity.class);
    i.putExtra("helloString", helloString);
    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
    }
  }

SecondActivity.Java code:

  @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é.

156
Mr Roshan Pawar

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() de votre fragment

Edit: la solution est de remplacer getActivity().startActivityForResult(i, 1); par startActivityForResult(i, 1);

240
Kevin Adesara

La réponse de Kevin fonctionne mais rend difficile l'utilisation des données avec cette solution.

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

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

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

32
Amit Patel

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

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

Cela déclenchera la méthode onActivityResult de fragments sur FirstActivity.Java.

23
Rahul Giradkar

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

12
android developer

La chose la plus importante, que tous manquent ici, est ... Le launchMode de FirstActivity doit être singleTop. S'il s'agit de singleInstance, onActivityResult dans FragmentA sera appelé juste après l'appel de la méthode startActivityForResult. Donc, il n’attendra pas l’appel de la méthode finish () dans SecondActivity.

Passez donc par les étapes suivantes, cela fonctionnera certainement comme cela a fonctionné pour moi aussi après une longue recherche.

Dans le fichier AndroidManifest.xml, définissez launchMode de FirstActivity.Java en tant que singleTop.

<activity
        Android:name=".FirstActivity"
        Android:label="@string/title_activity_main"
        Android:launchMode="singleTop"
        Android:theme="@style/AppTheme.NoActionBar" />

Dans FirstActivity.Java, substituez la méthode onActivityResult. Comme cela appellera onActivityResult of 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

Appelez la méthode finish(); dans SecondActivity.Java

J'espère que cela fonctionnera.

5
Shahbaz Ahmad

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

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

Activity enverra le résultat de l'activité à votre fragment.

4
sanjaymith

onActivityResult () de MAinActivity appellera, onActivityResult () on Fragment ne peut pas appeler car fragment est placé dans Activity, il est donc évident qu'il revient à MainActivity.

0
dileep krishnan