startActivityForResult () desde un Fragmento y una actividad secundaria final, no invoca aActivityResult () en Fragmento

172

FirstActivity.JavaTiene un FragmentA.Javaque llama startActivityForResult(). SecondActivity.Javallame finish()pero onActivityResultnunca se llame lo que está escrito FragmentA.Java.

FragmentA.Java código:

  @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 código:

  @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 onAcitvityResult()nunca me han llamado.

Sr. Roshan Pawar
fuente
1
Trate de ponerlo (método onActivityResult) en la clase
FirstActivity

Respuestas:

271

Debe escribir onActivityResult()en su FirstActivity.Javacomo sigue

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

Entonces esto llamará a tu fragmento onActivityResult()

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

Kevin Adesara
fuente
44
Gracias @Kevin, probé lo que dijiste pero no funciona. Pero i depurado el código, lo que veo onActivityresult()de FirstAcivity.Javaobtiene la llamada y onActivityresult()de FragmentA.Javanunca me llamaron. Por favor ayuda.
Sr. Roshan Pawar
52
Reemplace getActivity (). StartActivityForResult (i, 1); con startActivityForResult (i, 1);
Kevin Adesara
14
¿Podría ser que la respuesta en la solución aceptada en realidad no sea lo que está mal aquí, y la solución real es simplemente usar en startActivityForResultlugar de getActivity().start...? Porque hasta donde puedo ver, está anulando la definición de onActivityResultcon su propia definición, en la Actividad (es decir, esto se comporta exactamente igual que si la anulación en la respuesta no existiera).
amnn
@asQuirreL Sí. Esta es probablemente la razón.
Desarrollador de Android
1
Hago lo mismo que usted explica, anular onActivityResult () en la actividad también en fragmento con super en ambos y hacer startActivityForResult (intento, i), pero no funcionó, necesito ayuda por favor
Amal Kronz
33

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 comenzar startActivityForResult()a nivel de actividad.

en tu caso no llames getActivity().startActivityForResult(i, 1);

En su lugar, ¡solo úsalo startActivityForResult()y funcionará perfectamente bien! :)

Amit Patel
fuente
27

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

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

Esto activará el método onActivityResult de fragmentos en FirstActivity.java

Rahul Giradkar
fuente
2
gracias amigo ! pero requiere una API de nivel 26 ... así que en mi caso usé el método getSupportFragmentManager (). findFragmentByTag pero con tu idea
Dagnogo Jean-François
15

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

desarrollador de Android
fuente
7

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

Siga los siguientes pasos: Definitivamente funcionará como funcionó para mí también 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 onActivityResult. 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 onActivityResult

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

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

finish();Método de llamada en SecondActivity.java

Espero que esto funcione.

Md Shahbaz Ahmad
fuente
Esta es la mejor respuesta. El detalle de definir el "launchMode" en el Manifiesto es vital.
Pablo Insua
5

Podríamos llamar startActivityForResult()directamente desde Fragment, por lo que debe llamar en this.startActivityForResult(i, 1);lugar degetActivity().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 su fragmento.

sanjaymith
fuente
1

Que sea tarde para la respuesta. Pero será útil para cualquiera.

En mi caso, quiero llamar a la actividad desde Fragment y setResult desde el fragmento.

He usado getContext of Fragment Like.

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

Y establecer el resultado del fragmento

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

Ahora obteniendo resultados para fragmentar con

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

    }
}
Ajay Singh
fuente
0

onActivityResult () de MAinActivity llamará, onActivityResult () de Fragement no llamará porque el fragmento se coloca en la Actividad, por lo que obviamente vuelve a MainActivity

dileep krishnan
fuente
-2

No llame finish()al onCreate()método, entonces funciona bien.

Nagaraj Wadakannavar
fuente
-6

llame a su onActivityresult()en ParentActivity.

URAndroid
fuente
Gracias por responder @URAndroid, pero obtuve la solución. Tu solución no es perfecta. No es buena programación.
Sr. Roshan Pawar
Esto en realidad no es recomendable.
Lo-Tan