"Error al entregar el resultado" – onActivityForResult

Tengo una LoginActivity (el usuario se LoginActivity ). Es básicamente su propia Activity que tiene como tema un diálogo (para aparecer como si fuera un diálogo). Aparece sobre una SherlockFragmentActivity . Lo que quiero es: Si hay un inicio de sesión exitoso, debe haber dos FragmentTransaction para actualizar la vista. Aquí está el código:

En LoginActivity , si el inicio de sesión es LoginActivity ,

 setResult(1, new Intent()); 

En SherlockFragmentActvity :

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == 1) { LoggedStatus = PrefActivity.getUserLoggedInStatus(this); FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction(); SherlockListFragment mFrag = new MasterFragment(); t.replace(R.id.menu_frame, mFrag); t.commit(); // Set up Main Screen FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction(); SherlockListFragment mainFrag = new FeaturedFragment(); t2.replace(R.id.main_frag, mainFrag); t2.commit(); } } 

Se bloquea en el primer commit, con este LogCat:

 E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState E/AndroidRuntime(32072): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299) E/AndroidRuntime(32072): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310) E/AndroidRuntime(32072): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541) E/AndroidRuntime(32072): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525) E/AndroidRuntime(32072): at com.kickinglettuce.rate_this.MainFragmentActivity.onActivityResult(MainFragmentActivity.java:243) E/AndroidRuntime(32072): at android.app.Activity.dispatchActivityResult(Activity.java:5293) E/AndroidRuntime(32072): at android.app.ActivityThread.deliverResults(ActivityThread.java:3315) 

En primer lugar, usted debe leer mi post de blog para más información (se refiere a por qué esta excepción ocurre y lo que puede hacer para evitarlo).

Llamar commitAllowingStateLoss() es más un hack que una corrección. La pérdida del estado es mala y debe ser evitada a toda costa. En el momento en que se llama onActivityResult() es posible que el estado de actividad / fragmento no se haya restaurado todavía y, por lo tanto, cualquier transacción que ocurra durante este tiempo se perderá como resultado. Este es un error muy importante que debe ser abordado! (Tenga en cuenta que el error sólo ocurre cuando su Activity regresa después de haber sido asesinado por el sistema … que, dependiendo de la cantidad de memoria que el dispositivo tiene, a veces puede ser raro … por lo que este tipo de error no es algo que Es muy fácil de coger durante la prueba).

Trate de mover sus transacciones en onPostResume() lugar (tenga en cuenta que onPostResume() siempre se llama después onResume() y onResume() siempre se llama después onActivityResult() ):

 private boolean mReturningWithResult = false; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mReturningWithResult = true; } @Override protected void onPostResume() { super.onPostResume(); if (mReturningWithResult) { // Commit your transactions here. } // Reset the boolean flag back to false for next time. mReturningWithResult = false; } 

Esto puede parecer un poco extraño, pero hacer este tipo de cosas es necesario para asegurarse de que su FragmentTransaction s siempre se comprometen después de que el estado de la Activity ha sido restaurado a su estado original ( onPostResume() se garantiza que se llamará después de la Activity ' S estado ha sido restaurado).

En mi caso me enfrenté a los mismos problemas debido a la siguiente

 public void onBackPressed() { super.onBackPressed(); setIntents(); } private void setIntents(){ Intent searchConstaints=new Intent(); searchConstaints.putExtra("min",20); searchConstaints.putExtra("max",80); setResult(101,searchConstaints); finish(); } 

Solucionado restableciendo la función Llamadas dentro de OnBackPressed ()

 public void onBackPressed() { setIntents(); super.onBackPressed(); } 

Puede utilizar ft.commitAllowingStateLoss() para resolver este problema.

Razón: su método ft.commit() se onSaveInstanceState después de onSaveInstanceState .

Su logcat dice claramente: "No se puede realizar esta acción después de onSaveInstanceState" – su Activity ya está muerta en ese momento y no pudo devolver ningún resultado.

sólo muévete:

 Intent in = new Intent(); setResult(1, in); 

Al lugar de tu Activity donde todavía está vivo, y todo estará bien. Y no olvides finish() tu Activity para entregar el resultado.

  • Android Video Recording, intención de la cámara
  • ¿Cómo puedo enviar múltiples tipos de datos con Intent.ACTION_SEND_MULTIPLE al usar shareIntent?
  • Abrir cámara Android en una resolución inferior con ACTION_IMAGE_CAPTURE
  • Eliminación de la pila de actividad completa de Android en SDK antiguos (que carecen de FLAG_ACTIVITY_CLEAR_TASK)
  • Android - Inicio de una aplicación desde una instancia de ApplicationInfo
  • WheelView no rellena el padre
  • resultcode y datos null in onActivityresult
  • Actividades de conmutación de Android
  • Android: Evento ACTION_POWER_CONNECTED no se envía a mi BroadcastReceiver
  • "Tomar una foto y presentarla" en modo retrato en Samsung Galaxy S
  • Cómo borrar todas las actividades de la pila en API 8?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.