android - begin_array - java.lang.illegalstateexception expected begin_object but was string at line 1 column 1 path $
obteniendo la excepción "IllegalStateException: no se puede realizar esta acción después de onSaveInstanceState" (30)
Tengo una aplicación de Android en vivo, y del mercado recibí el siguiente seguimiento de pila y no tengo idea de por qué está sucediendo porque no está sucediendo en el código de la aplicación, pero se debe a que algunos u otros eventos de la aplicación (supuesto)
No estoy usando Fragmentos, todavía hay una referencia de FragmentManager. Si alguien puede arrojar algo de luz sobre algunos hechos ocultos para evitar este tipo de problema:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyDown(Activity.java:1962)
at android.view.KeyEvent.dispatch(KeyEvent.java:2482)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1720)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1258)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1668)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2851)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2824)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2011)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Al buscar en el código fuente de Android las causas que causan este problema, el indicador mStateSaved en la clase FragmentManagerImpl
(instancia disponible en Actividad) tiene un valor verdadero. Se establece en verdadero cuando se guarda la pila trasera (saveAllState) en la llamada de Activity#onSaveInstanceState
. Luego, las llamadas de ActivityThread no restablecen este indicador utilizando los métodos de restablecimiento disponibles de FragmentManagerImpl#noteStateNotSaved()
y dispatch()
.
A mi modo de ver, hay algunas correcciones disponibles, dependiendo de lo que haga y use su aplicación:
Buenas maneras
Antes que nada: publicitaría el artículo de Alex Lockwood . Entonces, de lo que he hecho hasta ahora:
Para fragmentos y actividades que no necesitan mantener información de estado, llame a commitAllowStateLoss . Tomado de la documentación:
Permite que el compromiso se ejecute después de que se guarde el estado de una actividad. Esto es peligroso porque la confirmación puede perderse si la actividad necesita ser restaurada posteriormente desde su estado, por lo que solo debe usarse en los casos en que está bien que el estado de la interfaz de usuario cambie inesperadamente en el usuario. Supongo que está bien usarlo si el fragmento muestra información de solo lectura. O incluso si muestran información editable, utilice los métodos de devolución de llamada para conservar la información editada.
Justo después de confirmar la transacción (usted acaba de llamar a
commit()
), realice una llamada aFragmentManager.executePendingTransactions()
.
Formas no recomendadas:
Como se mencionó anteriormente en Ovidiu Latcu, no llame a
super.onSaveInstanceState()
. Pero esto significa que perderá todo el estado de su actividad junto con el estado de los fragmentos.Sobrescriba
onBackPressed
y allí solo llame afinish()
. Esto debería estar bien si su aplicación no usa Fragments API; como ensuper.onBackPressed
hay una llamada aFragmentManager#popBackStackImmediate()
.Si está utilizando tanto la API de Fragmentos y el estado de su actividad es importante / vital, entonces podría intentar llamar utilizando
FragmentManagerImpl#noteStateNotSaved()
API de reflexión. Pero esto es un truco, o se podría decir que es una solución. No me gusta, pero en mi caso es bastante aceptable ya que tengo un código de una aplicación heredada que usa código obsoleto (TabActivity
yTabActivity
implícitamente).
A continuación se muestra el código que utiliza la reflexión:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
invokeFragmentManagerNoteStateNotSaved();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void invokeFragmentManagerNoteStateNotSaved() {
/**
* For post-Honeycomb devices
*/
if (Build.VERSION.SDK_INT < 11) {
return;
}
try {
Class cls = getClass();
do {
cls = cls.getSuperclass();
} while (!"Activity".equals(cls.getSimpleName()));
Field fragmentMgrField = cls.getDeclaredField("mFragments");
fragmentMgrField.setAccessible(true);
Object fragmentMgr = fragmentMgrField.get(this);
cls = fragmentMgr.getClass();
Method noteStateNotSavedMethod = cls.getDeclaredMethod("noteStateNotSaved", new Class[] {});
noteStateNotSavedMethod.invoke(fragmentMgr, new Object[] {});
Log.d("DLOutState", "Successful call for noteStateNotSaved!!!");
} catch (Exception ex) {
Log.e("DLOutState", "Exception on worka FM.noteStateNotSaved", ex);
}
}
¡Aclamaciones!
Bueno, después de probar todas las soluciones anteriores sin éxito (porque básicamente no tengo transacciones).
En mi caso, estaba utilizando AlertDialogs y ProgressDialog como fragmentos que, a veces, en la rotación, al solicitar el FragmentManager, el error aumenta.
Encontré una solución que mezcla varios posts similares:
Es una solución de 3 pasos, todo hecho en su FragmentActivity (en este caso, se llama GenericActivity):
private static WeakReference<GenericActivity> activity = null; //To avoid bug for fragments: Step 1 of 3
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//To avoid bug for fragments: Step 2 of 3
activity = new WeakReference<GenericActivity>(this);
}
@Override
public FragmentManager getSupportFragmentManager(){
//To avoid bug for fragments: Step 3 of 3
if (this == activity.get()) {
return super.getSupportFragmentManager();
}
return activity.get().getSupportFragmentManager();
}
Creo que el estado del ciclo de vida puede ayudar a evitar este bloqueo a partir de la versión v26.1.0 de la compatibilidad con Android. Puede realizar la siguiente comprobación:
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)){
// Do fragment''s transaction commit
}
o puedes probar:
Fragment.isStateSaved()
más información aquí https://developer.android.com/reference/android/support/v4/app/Fragment.html#isStateSaved()
Cuando uso startactivity en un fragmento, obtendré esta excepción;
Cuando cambio para usar startactivityforresult, la excepción desaparece :)
Así que la forma más fácil de solucionarlo es usar la API de startActivityForResult :)
Después de investigar un poco, la solución a este problema es hacer que su fragmento se comprometa en el resumen.
Fuente: https://wenchaojames.wordpress.com/2013/01/12/illegalstateexception-from-onactivityresult/
Dicha excepción se producirá si intenta realizar una transición de fragmentos después de que se onSaveInstanceState()
al onSaveInstanceState()
su actividad de fragmentos.
Una de las razones por las que esto puede suceder es si deja una AsyncTask
(o Thread
) en ejecución cuando se detiene una actividad.
Cualquier transición después de que se onSaveInstanceState()
podría perderse si el sistema reclama la actividad de los recursos y la vuelve a crear más tarde.
El mismo problema de mi parte y después de un día de análisis de todos los artículos, blog y , encontré una solución simple. No use savedInstanceState en absoluto, esta es la condición con una línea de código. En el código del fragmento:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
.....
En mi caso, con la misma excepción de error, puse "onBackPressed ()" en una tabla ejecutable (puede usar cualquiera de sus vistas):
myView.post(new Runnable() {
@Override
public void run() {
onBackPressed()
}
});
No entiendo por qué, pero funciona!
Este es el error más estúpido que he encontrado hasta ahora. Tenía una aplicación Fragment
funcionando perfectamente para API <11 , y Force Closing
en API> 11 .
Realmente no pude entender qué cambiaron dentro del ciclo de vida de la Activity
en la llamada a saveInstance
, pero aquí es cómo resolví esto:
@Override
protected void onSaveInstanceState(Bundle outState) {
//No call for super(). Bug on API Level > 11.
}
Simplemente no hago la llamada a .super()
y todo funciona muy bien. Espero que esto te ahorre tiempo.
EDIT: después de un poco más de investigación, este es un bug conocido en el paquete de soporte.
Si necesita guardar la instancia y agregar algo a su Bundle
, puede usar lo siguiente:
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
super.onSaveInstanceState(outState);
}
EDIT2: esto también puede ocurrir si está intentando realizar una transacción después de que su Activity
se haya ido en segundo plano. Para evitar esto debes usar commitAllowingStateLoss()
EDIT3: Las soluciones anteriores solucionaron problemas en las bibliotecas anteriores de support.v4 de lo que puedo recordar. Pero si todavía tiene problemas con esto, DEBE leer también el blog de @AlexLockwood : Fragment Transactions & Activity State Loss
Resumen de la publicación del blog (pero te recomiendo que lo leas):
- NUNCA
onPause()
transaccionescommit()
después deonPause()
en pre-Honeycomb, yonStop()
en post-Honeycomb - Tenga cuidado al realizar transacciones dentro de los métodos del ciclo de vida de la
Activity
. UseonCreate()
,onResumeFragments()
yonPostResume()
- Evite realizar transacciones dentro de métodos de devolución de llamada asíncronos
- Utilice
commitAllowingStateLoss()
solo como último recurso
Esto se ha corregido en Android 4.2 y también en la fuente de la biblioteca de soporte. [*]
Para obtener más información sobre la causa (y las soluciones), consulte el informe de errores de Google: bug
Si está utilizando la biblioteca de soporte, no debería preocuparse por este error (por mucho tiempo) [*]. Sin embargo, si está utilizando la API directamente (es decir, no está utilizando el FragmentManager de la biblioteca de asistencia) y está apuntando a una API por debajo de Android 4.2, deberá probar una de las soluciones alternativas.
[*] Al momento de escribir, el administrador del SDK de Android todavía está distribuyendo una versión anterior que presenta este error.
Editar Voy a agregar algunas aclaraciones aquí porque, obviamente, de alguna manera he confundido a quien haya rechazado esta respuesta.
Hay varias circunstancias diferentes (pero relacionadas) que pueden provocar que se lance esta excepción . Mi respuesta anterior se refiere a la instancia específica discutida en la pregunta, es decir, un error en Android que posteriormente se ha corregido. Si está recibiendo esta excepción por otro motivo, es porque está agregando / eliminando fragmentos cuando no debería hacerlo (después de haber guardado los estados de los fragmentos). Si se encuentra en una situación así, tal vez pueda serle de utilidad " Fragmentos anidados - IllegalStateException" No se puede realizar esta acción después de onSaveInstanceState " ".
Esto sucede cuando intenta cargar un fragmento, pero la actividad ha cambiado su estado a onPause (). Esto ocurre, por ejemplo, cuando intenta obtener datos y cargarlos en la actividad, pero cuando el usuario ha hecho clic en algún botón y ha Se trasladó a la siguiente actividad.
Puedes resolver esto de dos maneras.
Puede usar transaction.commitAllowingStateLoss () en lugar de transaction.commit () para cargar el fragmento, pero puede terminar perdiendo la operación de confirmación que se realizó.
o
Asegúrate de que la actividad se reanude y no se pause al cargar un fragmento. Cree un valor booleano y verifique si la actividad no va a pasar al estado Pausa ().
@Override
public void onResume() {
super.onResume();
mIsResumed = true;
}
@Override
public void onPause() {
mIsResumed = false;
super.onPause();
}
luego, al cargar el fragmento, compruebe si hay actividad y cargue solo cuando la actividad esté en primer plano.
if(mIsResumed){
//load the fragment
}
Esto también puede suceder cuando se llama a la función dismiss()
en un fragmento de diálogo después de que la pantalla se haya bloqueado / en blanco y se haya guardado el estado de la instancia del diálogo Actividad +. Para sortear esta llamada:
dismissAllowingStateLoss()
Literalmente, cada vez que termino un diálogo, ya no me importa su estado, así que está bien, no estás perdiendo ningún estado.
Gracias @gunar, pero creo que hay una mejor manera.
Según el doc:
* If you are committing a single transaction that does not modify the * fragment back stack, strongly consider using * {@link FragmentTransaction#commitNow()} instead. This can help avoid * unwanted side effects when other code in your app has pending committed * transactions that expect different timing. * * @return Returns true if there were any pending transactions to be * executed. */ public abstract boolean executePendingTransactions();
Entonces use commitNow
para reemplazar:
fragmentTransaction.commit();
FragmentManager.executePendingTransactions()
Lea http://chris-alexander.co.uk/on-engineering/dev/android-fragments-within-fragments/
artículo. La comprobación de fragment.isResumed () me ayuda en onDestroyView w / o usando el método onSaveInstanceState.
Lo que descubrí es que si otra aplicación es de tipo diálogo y permite que se envíen toques a la aplicación en segundo plano, casi cualquier aplicación en segundo plano se bloqueará con este error. Creo que debemos verificar cada vez que se realiza una transacción si la instancia se guardó o se restauró.
Mi caso de uso: he utilizado la escucha en el fragmento para notificar a la actividad que algo sucedió. Hice nuevo fragmento de confirmación en el método de devolución de llamada. Esto funciona perfectamente bien la primera vez. Pero en el cambio de orientación, la actividad se recrea con el estado de instancia guardado. En ese caso, el fragmento no se crea de nuevo implica que el fragmento tiene el oyente que es una actividad destruida de edad. De cualquier forma, el método de devolución de llamada se activará con la acción. Va a la actividad destruida que causa el problema. La solución es restablecer el oyente en fragmentos con la actividad en vivo actual. Esto resuelve el problema.
Mi solución para ese problema fue
En el fragmento agregar métodos:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
guideMapFragment = (SupportMapFragment)a.getSupportFragmentManager().findFragmentById(R.id.guideMap);
guideMap = guideMapFragment.getMap();
...
}
@Override
public void onDestroyView() {
SherlockFragmentActivity a = getSherlockActivity();
if (a != null && guideMapFragment != null) {
try {
Log.i(LOGTAG, "Removing map fragment");
a.getSupportFragmentManager().beginTransaction().remove(guideMapFragment).commit();
guideMapFragment = null;
} catch(IllegalStateException e) {
Log.i(LOGTAG, "IllegalStateException on exit");
}
}
super.onDestroyView();
}
Puede ser malo, pero no pudo encontrar nada mejor.
Noté algo muy interesante. Tengo en mi aplicación la opción de abrir la galería del teléfono y el dispositivo pregunta qué aplicación usar, ahí hago clic en el área gris del cuadro de diálogo y veo este problema. Noté cómo mi actividad va de onPause, onSaveInstanceState de nuevo a onResume, no sucede que visite onCreateView. Estoy haciendo transacciones en onResume. Entonces, lo que terminé haciendo es establecer una bandera que se niega en Pausa, pero que es cierto enCreateView. si el indicador es verdadero onResume, entonces onCommit, de lo contrario, commitAllowingStateLoss. Podría seguir y perder tanto tiempo, pero quería comprobar el ciclo de vida. Tengo un dispositivo que es sdkversion 23, y no tengo este problema, pero tengo otro que tiene 21, y ahí lo veo.
Puede que estés llamando fragmentManager.popBackStackImmediate (); cuando la actividad está en pausa. La actividad no ha finalizado, pero está en pausa y no en primer plano. Debe comprobar si la actividad está en pausa o no antes de popBackStackImmediate ().
Recibía esta excepción cuando presionaba el botón Atrás para cancelar el selector de intento en la actividad de mi fragmento de mapa. Resolví esto al reemplazar el código de onResume () (donde estaba inicializando el fragmento y confirmando la transacción) a onStart () y la aplicación está funcionando bien ahora. Espero eso ayude.
Resolví el problema con onconfigurationchanged. El truco es que de acuerdo con el ciclo de vida de la actividad de Android, cuando llamaste explícitamente una intención (intención de la cámara o cualquier otra); la actividad se detiene y se llama onsavedInstance en ese caso. Al girar el dispositivo a una posición diferente a la posición durante la cual la actividad estaba activa; la realización de operaciones de fragmentos, como la confirmación de fragmentos, causa una excepción de estado ilegal. Hay muchas quejas al respecto. Es algo sobre la administración del ciclo de vida de la actividad de Android y las llamadas a métodos adecuados. Para resolverlo, hice lo siguiente: 1-Anular el método de actividad activada por la Inserción guardada, y determinar la orientación de la pantalla actual (vertical u horizontal) y luego establecer su orientación de pantalla antes de que la actividad se detenga. de esa manera, la actividad bloquea la rotación de pantalla para su actividad en caso de que haya sido girada por otra. 2-entonces, anule el método de actividad de reanudación y establezca su modo de orientación ahora al sensor, de modo que después de que se llame al método guardado, llamará una vez más a la configuración para tratar la rotación correctamente.
Puede copiar / pegar este código en su actividad para tratar con él:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Toast.makeText(this, "Activity OnResume(): Lock Screen Orientation ", Toast.LENGTH_LONG).show();
int orientation =this.getDisplayOrientation();
//Lock the screen orientation to the current display orientation : Landscape or Potrait
this.setRequestedOrientation(orientation);
}
//A method found in , don''t remember the author, to determine the right screen orientation independently of the phone or tablet device
public int getDisplayOrientation() {
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
// Sometimes you may get undefined orientation Value is 0
// simple logic solves the problem compare the screen
// X,Y Co-ordinates and determine the Orientation in such cases
if (orientation == Configuration.ORIENTATION_UNDEFINED) {
Configuration config = getResources().getConfiguration();
orientation = config.orientation;
if (orientation == Configuration.ORIENTATION_UNDEFINED) {
// if height and widht of screen are equal then
// it is square orientation
if (getOrient.getWidth() == getOrient.getHeight()) {
orientation = Configuration.ORIENTATION_SQUARE;
} else { //if widht is less than height than it is portrait
if (getOrient.getWidth() < getOrient.getHeight()) {
orientation = Configuration.ORIENTATION_PORTRAIT;
} else { // if it is not any of the above it will defineitly be landscape
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
}
}
return orientation; // return value 1 is portrait and 2 is Landscape Mode
}
@Override
public void onResume() {
super.onResume();
Toast.makeText(this, "Activity OnResume(): Unlock Screen Orientation ", Toast.LENGTH_LONG).show();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
Se llamará a onSaveInstance si un usuario gira la pantalla para que pueda cargar los recursos asociados con la nueva orientación.
Es posible que este usuario haya girado la pantalla seguido de presionar el botón Atrás (porque también es posible que este usuario haya perdido el control de su teléfono mientras usa su aplicación)
Siempre recibía esto cuando intentaba mostrar el fragmento en el método onActivityForResult (), por lo que el problema era el siguiente:
- Mi actividad está en pausa y detenida, lo que significa que ya se llamó a onSaveInstanceState () (para dispositivos anteriores a Honeycomb y posteriores a Honeycomb).
- En caso de cualquier resultado, hice una transacción para mostrar / ocultar el fragmento, lo que causa esta excepción IllegalStateException.
Lo que hice es el siguiente:
- Valor agregado para determinar si se realizó la acción que deseo (p. Ej., Tomar una foto de la cámara, es PhotoTaken): puede ser un valor booleano o entero, según la cantidad de transacciones que necesite.
- Al anular el método onResumeFragments (), verifiqué mi valor y después de realizar las transacciones fragmentarias que necesitaba. En este caso, commit () no se realizó después de onSaveInstanceState, ya que el estado se devolvió en el método onResumeFragments ().
Simplemente llame a super.onPostResume () antes de mostrar su fragmento o mueva su código en el método onPostResume () después de llamar a super.onPostResume (). ¡Esto resuelve el problema!
Solución corta y de trabajo:
Siga los pasos simples:
Paso 1 : Reemplace el estado onSaveInstanceState en el fragmento respectivo. Y eliminar el método super de ella.
@Override
public void onSaveInstanceState(Bundle outState) {
};
Paso 2 : Utilice CommitAllowingStateLoss (); en lugar de commit (); mientras se fragmentan las operaciones.
fragmentTransaction.commitAllowingStateLoss();
Tengo el mismo problema en mi aplicación. He resuelto este problema simplemente llamando a super.onBackPressed();
en la clase anterior y llamando a commitAllowingStateLoss()
en la clase actual con ese fragmento.
Tengo este problema. Pero creo que este problema no está relacionado con commit y commitAllowStateLoss.
El siguiente mensaje de excepción y rastreo de pila es sobre commit ().
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
Pero esta excepción fue causada por onBackPressed ()
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(Unknown Source)
at android.support.v4.app.FragmentActivity.onBackPressed(Unknown Source)
Todos fueron causados por checkStateLoss ()
private void checkStateLoss() {
if (mStateSaved) {
throw new IllegalStateException(
"Can not perform this action after onSaveInstanceState");
}
if (mNoTransactionsBecause != null) {
throw new IllegalStateException(
"Can not perform this action inside of " + mNoTransactionsBecause);
}
mStateSaved será verdadero después de onSaveInstanceState.
Este problema rara vez ocurre. Nunca he encontrado este problema. No puedo volver a ocurrir el problema.
Encontré el problema 25517
Podría haber ocurrido en las siguientes circunstancias
Se llama a la tecla Atrás después de onSaveInstanceState, pero antes de que se inicie la nueva actividad.
No estoy seguro de cuál es la raíz del problema. Así que utilicé un camino feo.
@Override
public void onBackPressed() {
try{
super.onBackPressed();
}catch (IllegalStateException e){
// can output some information here
finish();
}
}
Tuve el mismo problema: obtuve IllegalStateException, pero reemplazar todas mis llamadas a commit () con commitAllowingStateLoss () no ayudó.
El culpable fue una llamada a DialogFragment.show ().
Lo rodeo de
try {
dialog.show(transaction, "blah blah");
}
catch(IllegalStateException e) {
return;
}
y eso lo hizo. De acuerdo, no puedo mostrar el diálogo, pero en este caso estuvo bien.
Era el único lugar en mi aplicación donde llamé por primera vez FragmentManager.beginTransaction (), pero nunca llamé a commit (), así que no lo encontré cuando busqué "commit ()".
Lo curioso es que el usuario nunca abandona la aplicación. En cambio, el asesino era un anuncio intersticial de AdMob que aparecía.
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 nuevamente el FragmentManager!
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();
}
}
puede usar FragmentActivity.onStart antes de popBackStackImmediate
Me gusta esto:
public void backStackFragment() {
this.start();
getFragmentManager().popBackStackImmediate();
}
public void start(){
FragmentActivity a = getActivity();
if(a instanceof DepositPlanPadActivity){
((DepositPlanPadActivity)a).onStart();
}
if(a instanceof SmallChangePlanPad){
((SmallChangePlanPad)a).onStart();
}
if(a instanceof UserCenterActivity){
((UserCenterActivity)a).onStart();
}
}
http://jorryliu.blogspot.com/2014/09/illegalstateexception-can-not-perform.html