startActivityForResult () à partir d'un Fragment et terminer une activité enfant, n'appelle pas onActivityResult () dans Fragment

172

FirstActivity.Javaa un FragmentA.Javaqui appelle startActivityForResult(). SecondActivity.Javaappeler finish()mais onActivityResultne jamais être appelé ce qui est écrit 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 je n'ai onAcitvityResult()jamais été appelé.

M. Roshan Pawar
la source
1
Essayez de le mettre (méthode onActivityResult) dans la classe
FirstActivity
2
duplication possible de onActivityResult non appelée dans Fragment
QED

Réponses:

271

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

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

Donc cela appellera votre fragment onActivityResult()

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

Kevin Adesara
la source
4
Merci @Kevin, j'ai essayé ce que vous avez dit mais cela ne fonctionne pas. Mais je débogués le code, je vois onActivityresult()d' FirstAcivity.Javaest appelé et onActivityresult()de FragmentA.Javane sont jamais appelé. Veuillez aider.
Mr Roshan Pawar
52
Veuillez remplacer getActivity (). StartActivityForResult (i, 1); avec startActivityForResult (i, 1);
Kevin Adesara
14
Se pourrait-il que la réponse dans la solution acceptée ne soit en fait pas ce qui ne va pas ici, et que la vraie solution consiste simplement à utiliser startActivityForResultau lieu de getActivity().start...? Parce que pour autant que je puisse voir, vous remplacez la définition de onActivityResultavec sa propre définition, dans l'activité (c'est-à-dire que cela se comporte exactement comme si le remplacement dans la réponse n'existait pas).
amnn le
@asQuirreL Oui. c'est probablement la raison.
développeur android
1
Je fais la même chose que vous expliquez, remplacez onActivityResult () dans l'activité également dans fragment avec super dans les deux et faites startActivityForResult (intent, i), mais n'a pas fonctionné, j'ai besoin d'aide s'il vous plaît
Amal Kronz
33

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()au niveau d'activité.

dans ton cas n'appelle pas getActivity().startActivityForResult(i, 1);

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

Amit Patel
la source
27

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

Rahul Giradkar
la source
2
Merci mon pote ! mais il nécessite une API de niveau 26 .. donc dans mon cas, j'ai utilisé la méthode getSupportFragmentManager (). findFragmentByTag mais avec votre idée
Dagnogo Jean-François
15

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

développeur android
la source
7

La chose la plus importante, qui manque ici, c'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.

Alors passez 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, remplacez la méthode onActivityResult. Comme cela appellera le onActivityResult de FragmentA.

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

Dans FragmentA.Java, remplacez la méthode onActivityResult

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

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

finish();Méthode d' appel dans SecondActivity.java

J'espère que cela fonctionnera.

Md Shahbaz Ahmad
la source
C'est la meilleure réponse. Le détail de la définition du "launchMode" dans le manifeste est essentiel.
Pablo Insua
5

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

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

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

Sanjaymith
la source
1

Qu'il soit tard pour la réponse. Mais sera utile pour n'importe qui.

Dans mon cas, je veux appeler l'activité de Fragment et setResult à partir du fragment.

J'ai utilisé getContext de Fragment Like.

startActivityForResult(new Intent(getContext(), NextActivity.class), 111);

Et définir le résultat du fragment

getActivity().setResult(Activity.RESULT_OK);
                    getActivity().finish();

Obtenir maintenant le résultat du fragment avec

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == 111) {

    }
}
ajay singh
la source
0

onActivityResult () de MAinActivity appellera, onActivityResult () de Fragement n'appellera pas parce que le fragment est placé dans Activity donc évidemment il reviendra à MainActivity

Dileep Krishnan
la source
-2

Ne pas appeler finish()en onCreate()méthode il fonctionne très bien.

Nagaraj Wadakannavar
la source
-6

appelez votre onActivityresult()dans ParentActivity.

URAndroid
la source
Merci pour la réponse @URAndroid, mais j'ai obtenu la solution. Votre solution n'est pas parfaite. Ce n'est pas une bonne programmation.
Mr Roshan Pawar
Ce n'est en fait pas recommandé.
Lo-Tan