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