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.


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


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


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


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


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.


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.


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

    }
}

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



-6

llame a su onActivityresult()en ParentActivity.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.