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é.
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);
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! :)
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.
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, 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.
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.
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.