supportfragmentmanager studio que getsupportfragmentmanager fragmentactivity example activity android android-fragmentactivity

android - studio - startActivityForResult() de una actividad secundaria Fragment and finishing, no llama a OnActivityResult() en Fragment



getsupportfragmentmanager in fragment (9)

FirstActivity.Java tiene un FragmentA.Java que llama a startActivityForResult() . SecondActivity.Java call finish() pero onActivityResult nunca se llama que está escrito en FragmentA.Java .

Código FragmentA.Java :

@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 } }

Código SecondActivity.Java :

@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(); }

He intentado depurar el código, pero en onAcitvityResult() nunca se llama.


Debe escribir onActivityResult() en su FirstActivity.Java siguiente manera

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

Entonces esto llamará a tu fragmento en el onActivityResult() la onActivityResult()

Editar: la solución es reemplazar getActivity().startActivityForResult(i, 1); con startActivityForResult(i, 1);


Debe escribir onActivityResult () en su FirstActivity.Java de la siguiente manera

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

Esto desencadenará el método de fragmentos de prueba de actividad en FirstActivity.java


El fragmento ya tiene startActivityForResult , que llamaría onActivityResult en el fragmento si lo usa, en lugar de getActivity() ...


La respuesta de Kevin funciona pero hace que sea difícil jugar con los datos usando esa solución.

La mejor solución es no iniciar startActivityForResult() en el nivel de actividad.

en su caso, no llame a getActivity().startActivityForResult(i, 1);

En su lugar, simplemente use startActivityForResult() y ¡funcionará perfectamente bien! :)


Lo más importante, que todos faltan aquí es ... El launchMode de FirstActivity debe ser singleTop. Si es SingleInstance, se invocará onActivityResult en FragmentA justo después de llamar al método startActivityForResult. Por lo tanto, no esperará a llamar al método finish () en SecondActivity.

Así que sigue los siguientes pasos: Definitivamente funcionará, ya que también funcionó para mí después de una larga investigación.

En el archivo AndroidManifest.xml, haga launchMode of FirstActivity.Java como singleTop.

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

En FirstActivity.java, anule el método de prueba de actividad. Como esto llamará a onActivityResult of FragmentA.

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

En FragmentA.Java, anule el método de prueba de actividad

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

Llame a startActivityForResult(intent, HOMEWORK_POST_ACTIVITY); de FragmentA.Java

finish(); llamada finish(); método en SecondActivity.java

Espero que esto funcione


No llame a finish() en el método onCreate() , entonces funciona bien.


Podríamos llamar a startActivityForResult() directamente desde Fragment, por lo que deberíamos llamar this.startActivityForResult(i, 1); en lugar de getActivity().startActivityForResult(i, 1);

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

La actividad enviará el Resultado de la actividad a tu Fragmento.


llame a su onActivityresult() en ParentActivity.


onActivityResult () de MAinActivity llamará, onActivityResult () de Fragement no llamará porque el fragmento se coloca en Activity, así que obviamente vuelve a MainActivity