"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
,
- El envío por correo electrónico de texto con formato HTML solo funciona con el cliente de Gmail
- Rjava.lang.IllegalArgumentException en startActivity (intención, animación de paquete)
- Intentando abrir una carpeta específica en android utilizando la intención
- Leer un archivo pdf desde la carpeta de activos
- Error al recibir el problema de intento de difusión
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)
- Permitir que el usuario seleccione cámara o galería para la imagen
- Eliminar el botón de aplicación reciente como se hace en la aplicación SureLock
- Compartir imagen sin WRITE_EXTERNAL_STORAGE?
- Pid para el proceso que envió una intención
- onClick () confusión de eventos con el parámetro
- Elija un directorio / archivo utilizando Intent.ACTION_CREATE_DOCUMENT (Storage Access Framework)
- Detección de dispositivo Bluetooth en Android - startDiscovery ()
- Se pierde el envío de datos a la actividad principal
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.
- Utilizando startActivityForResult, ¿cómo obtener requestCode en la actividad de un niño?
- Botón Atrás y actividad refrescante previa