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


1
Essayez de le mettre (méthode onActivityResult) dans la classe
FirstActivity

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);


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! :)


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


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()...


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.


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.


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) {

    }
}

0

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



-6

appelez votre onActivityresult()dans ParentActivity.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.