tutorial studio relación qué las fragments fragmentos español entre desde cual con comunicar comunicacion activity actividades abrir android android-fragments illegalstateexception

android - studio - main activity fragment



"No se puede realizar esta acción después de onSaveInstanceState": ¿por qué recibo esta excepción del método onResume de mi actividad? (6)

Primero desarrollo mi aplicación orientada a Android 2.2 (SDK 8), usando la biblioteca de soporte v4, y cuando empiezo a usarla con 4.2 (SDK 17), tuve los mismos problemas con mis fragmentos. Pero al cambiar mi Manifiesto a android: minSdkVersion = "8" android: targetSdkVersion = "17", resolví mis problemas. Quizás esto también lo sea.

Mi actividad invoca la cámara con el intento ACTION_IMAGE_CAPTURE. Si la actividad de la cámara vuelve satisfactoriamente, configuro un indicador en la devolución de llamada onActivityResult y, en función del valor de la marca, empiezo un fragmento en mi onResume para agregar un título a la imagen que se capturó. Esto parece funcionar bien.

Acabo de obtener un rastro de pila de la "salvaje" quejándose de que estaba tratando de cometer una transacción de fragmento después de que se invocó onSaveInstanceState. ¡Pero estoy haciendo la confirmación en mi método onResume! ¿Por qué Android se quejaría de esto? Tengo android: configChanges = "orientation | keyboardHidden | keyboard | screenSize" establecido en mi AndroidManifest.xml, por lo que un cambio de orientación no debería desencadenar esto ....

Esto ocurrió en un Samsung Galaxy S3 (SGH-i747) con 4.0.4

Aquí está la pila:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314) at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548) at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532) at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.performFragmentTransition(AddPhotosActivity2.java:278) at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.switchToCaptionsFragment(AddPhotosActivity2.java:438) at com.Familiar.Android.FamiliarAppV1.AddPhotosActivity2.onResume(AddPhotosActivity2.java:167) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1158) at android.app.Activity.performResume(Activity.java:4544) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2448) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2486) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1187) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4514) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) at dalvik.system.NativeStart.main(Native Method)

Cualquier ayuda o sabiduría es apreciada.


Siempre estaba obteniendo esto cuando traté de mostrar el fragmento en el método de la actividad para el resultado (), por lo que el problema era el siguiente:

  1. Mi actividad está en pausa y detenida, lo que significa que ya se ha llamado a onSaveInstanceState () (tanto para dispositivos pre Honeycomb como posteriores a Honeycomb).
  2. En caso de cualquier resultado hice una transacción para mostrar / ocultar el fragmento, lo que causa esta IllegalStateException.

Lo que hice es el siguiente:

  1. Valor agregado para determinar si se realizó la acción que deseo (por ejemplo, tomar una foto de camere - isPhotoTaken) - puede ser un valor booleano o entero, dependiendo de cuántas transacciones diferentes necesite.
  2. En el método overriden onResumeFragments (), verifiqué mi valor y después de realizar las transacciones de fragmento que necesitaba. En este caso, commit () no se realizó después de onSaveInstanceState, ya que el estado se devolvió en el método onResumeFragments ().

esto funcionó para mí ... descubrí esto por mi cuenta ... ¡espero que te ayude!

1) NO tiene un FragmentManager / FragmentTransaction "estático" global.

2) onCreate, ¡SIEMPRE inicialice FragmentManager nuevamente!

muestra a continuación: -

public abstract class FragmentController extends AnotherActivity{ protected FragmentManager fragmentManager; protected FragmentTransaction fragmentTransaction; protected Bundle mSavedInstanceState; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSavedInstanceState = savedInstanceState; setDefaultFragments(); } protected void setDefaultFragments() { fragmentManager = getSupportFragmentManager(); //check if on orientation change.. do not re-add fragments! if(mSavedInstanceState == null) { //instantiate the fragment manager fragmentTransaction = fragmentManager.beginTransaction(); //the navigation fragments NavigationFragment navFrag = new NavigationFragment(); ToolbarFragment toolFrag = new ToolbarFragment(); fragmentTransaction.add(R.id.NavLayout, navFrag, "NavFrag"); fragmentTransaction.add(R.id.ToolbarLayout, toolFrag, "ToolFrag"); fragmentTransaction.commitAllowingStateLoss(); //add own fragment to the nav (abstract method) setOwnFragment(); } }


puedes usar el método commitAllowingStateLoss()

pero ten en cuenta que puedes perder el estado de tu actividad, como puedes ver en la referencia de Google para Android, que explica las diferencias entre las dos de la siguiente manera

Like commit () pero permite que la confirmación se ejecute después de guardar el estado de una actividad. Esto es peligroso porque la confirmación puede perderse si la actividad necesita ser restaurada más tarde desde su estado, por lo tanto, esto solo debe usarse para casos en los que está bien que el estado de la IU cambie inesperadamente en el usuario.

según mi experiencia, puede hacer que el método addToBackStack no funcione a veces, por lo que deberá agregarlo manualmente en el fragmento y, por supuesto, el estado no se guardará (texto textbox ext.)


Actualización Creo que he encontrado una explicación y una solución aquí: http://code.google.com/p/android/issues/detail?id=23096#c4 Implementé la Solución de Fragmento Vacío publicada allí y no obtuve más IllegalStateException por lo que lejos.

Agrego el fragmento de estado invisible en mi actividad de esta manera;

@Override protected void onCreate(final Bundle args) { ... if (args == null) { final FragmentManager fm = this.getSupportFragmentManager(); final FragmentTransaction ft = fm.beginTransaction(); final Fragment emptyFragmentWithCallback = new EmptyFragmentWithCallbackOnResume(); ft.add(emptyFragmentWithCallback, EmptyFragmentWithCallbackOnResume.TAG); ft.commit(); }

El siguiente código está tomado del enlace de arriba:

public class EmptyFragmentWithCallbackOnResume extends Fragment { OnFragmentAttachedListener mListener = null; @Override public void onAttach(SupportActivity activity) { super.onAttach(activity); try { mListener = (OnFragmentAttachedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentAttachedListener"); } } @Override public void onResume() { super.onResume(); if (mListener != null) { mListener.OnFragmentAttached(); } } public interface OnFragmentAttachedListener { public void OnFragmentAttached(); } }

e invocar transacciones de fragmentos que entrarían intuitivamente en Resume o onResumeFragments en mi método onFragmentAttached personalizado invocado por el fragmento de estado invisible. No utilizo onResumeFragments en absoluto y no emite transacciones de fragmentos en onResume.

Entonces, para resumir. Si está utilizando el soporte lib y los fragmentos, olvídese de onResume, olvídese de OnResumeFragments e implemente su propio "onResume" basado en la solución anterior. Esto es algo ridículo.

No puedo confirmar Tengo exactamente el mismo problema. a pesar de que estoy emitiendo transacciones de fragmentos en onResumeFragments. Esto solía funcionar como publiqué aquí: IllegalStateException - Fragment support library .

Parece que el error solo ocurre en 4.0.3 y 4.0.4. Sin embargo, no ocurre ni siempre ni en mi Emulador.

Estoy usando support lib rev. 10 y API 16. Llamo DialogFragment.show en onResumeFragments y recibo continuamente esta ridícula excepción de algunos usuarios aleatorios. No puedo reproducirlo localmente


Creo que sé la respuesta: estoy usando la biblioteca de compatibilidad de FragmentActivity de v4, por lo que debo realizar mis transacciones de fragmentos en onResumeFragments en lugar de onResume. ¿Alguien puede confirmar?