183 votes

startActivityForResult() à partir d'un Fragment et d'une Activité enfant finissante, n'appelle pas onActivityResult() dans le Fragment

FirstActivity.Java a un FragmentA.Java qui appelle startActivityForResult() . SecondActivity.Java appelez finish() mais onActivityResult ne sont jamais appelés, ce qui est écrit dans 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() ne sont jamais appelés.

1 votes

Essayez de la placer (méthode onActivityResult) dans la classe FirstActivity.

2 votes

291voto

Kevin Adesara Points 964

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 va appeler votre fragment onActivityResult()

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

6 votes

Merci @Kevin , j'ai essayé ce que vous avez dit mais ça ne marche pas. Mais j'ai débogué le code, je vois que onActivityresult() de FirstAcivity.Java est appelé et onActivityresult() de FragmentA.Java ne sont jamais appelés. Veuillez m'aider.

55 votes

Veuillez remplacer getActivity().startActivityForResult(i, 1) ; par startActivityForResult(i, 1) ;

17 votes

Serait-il possible que la réponse dans la solution acceptée ne soit pas ce qui ne va pas ici, et que le réel La solution consiste à utiliser simplement startActivityForResult au lieu de getActivity().start... ? Parce que d'après ce que je vois, vous remplacez la définition de onActivityResult avec sa propre définition, dans l'activité (c'est-à-dire que cela se comporte exactement de la même manière que si la dérogation dans la réponse n'existait pas).

34voto

Amit Patel Points 55

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 commencer startActivityForResult() sur le niveau d'activité.

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

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

31voto

Rahul Giradkar Points 1064

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 des fragments sur FirstActivity.java.

2 votes

Merci mon pote ! mais cela nécessite une API de niveau 26 donc dans mon cas j'ai utilisé la méthode getSupportFragmentManager().findFragmentByTag mais avec votre idée

15voto

android developer Points 20939

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

10voto

Shahbaz Ahmad Points 33

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

Alors suivez les étapes suivantes, cela marchera certainement comme cela a marché pour moi aussi après une longue recherche.

Dans le fichier AndroidManifest.xml, faites en sorte que launchMode de FirstActivity.Java soit singleTop.

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

Dans FirstActivity.java, remplacez la méthode onActivityResult. Comme cela va appeler le onActivityResult de FragmentA.

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

Dans le FragmentA.Java, surchargez 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); du FragmentA.Java

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

J'espère que ça va marcher.

0 votes

C'est la meilleure réponse. Le détail de la définition du "launchMode" dans le Manifest est essentiel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X