Estoy desarrollando un lanzador de aplicaciones que muestra un dialogfragment cuando el usuario se autentica a sí mismo. La mayoría de las veces esto está funcionando bien, pero a veces estoy teniendo este error de registro:

02-07 18:55:56.619: E/AndroidRuntime(1300): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1280)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1291)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.BackStackRecord.commit(BackStackRecord.java:532)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.DialogFragment.dismissInternal(DialogFragment.java:292)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.DialogFragment.dismiss(DialogFragment.java:258)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.blablabla.android.app.fragments.login.LoginResultFragment$CloseDialogRunnable.run(LoginResultFragment.java:59)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Handler.handleCallback(Handler.java:615)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Looper.loop(Looper.java:137)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at java.lang.reflect.Method.invokeNative(Native Method)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at java.lang.reflect.Method.invoke(Method.java:511)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at dalvik.system.NativeStart.main(Native Method)

He buscado en otros hilos, para ejemplo y seguido sus sugerencias, pero aún no funciona para mí

Mi dialogfragment parece:

public class LoginResultFragment extends DialogFragment implements
OnClickListener {
private CloseDialogRunnable runnable = null;
public class CloseDialogRunnable implements Runnable {
/**
* https://stackoverflow.com/questions/5844308/removecallbacks-not-
* stopping-runnable
*/
private boolean killCloseActivityRunnable = false;
public void killRunnable() {
killCloseActivityRunnable = true;
}
@Override
public void run() {
if (killCloseActivityRunnable) {
return;
}
if (getDialog()!=null && getDialog().isShowing()) {             
dismiss();              
}
}
}
@Override
public void onDismiss(DialogInterface dialog) {
if (runnable != null){      
runnable.killRunnable();
handler.removeCallbacks(runnable);
}
super.onDismiss(dialog);
}
/** Milliseconds until we dismiss the timeout */
private static final long DISMISSING_TIMEOUT = 2000;
/** Dismissing window handler */
private final Handler handler = new Handler();
private LoginResultFragment() {
}
public static LoginResultFragment getInstance(
Map<String, Object> currentValues) {
LoginResultFragment result = new LoginResultFragment();
set extra fields...
return result;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_FRAME,
android.R.style.Theme_Holo_Dialog);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setRetainInstance(true);
rootView = inflater.inflate(R.layout.fragment_login_result, container);
getDialog().getWindow().setBackgroundDrawable(
new ColorDrawable(android.graphics.Color.TRANSPARENT));
do UI stuff...
dismissAfterTimeout();
return rootView;
}
private void dismissAfterTimeout() {
runnable = new CloseDialogRunnable();
handler.postDelayed(runnable, DISMISSING_TIMEOUT);
}
@Override
public void onSaveInstanceState(Bundle outState) {
}
}

Y la llamo con:

final android.app.FragmentTransaction trans = activity
.getFragmentManager().beginTransaction();
trans.add(fragment, fragment.getClass().getCanonicalName());
trans.commitAllowingStateLoss();
Se pueden añadir más detalle alrededor de donde usted hace la FragmentTransaction? Veo que usted está agregando el fragmento para el gestor de transacciones, pero se va a añadir al diseño? Qué sucede después de que podrían caso de que el onSaveInstanceState() que se llama en el Fragmento (pausa, terminar la actividad, etc.)?
Hola jacobhyphenated, gracias por tu comentario. Yo no soy de agregar el fragmento de la estructura, ya que yo estoy mostrando como un diálogo (es un DialogFragment). Yo lo muestro cuando voy a recibir alguna información de inicio de sesión de otro proceso.
posibles duplicados de Mostrar DialogFragment de onActivityResult
He hecho una solución alternativa a DialogFragment, que se puede evitar esta excepción : github.com/AndroidDeveloperLB/DialogShard

OriginalEl autor Guillermo Merino | 2014-02-07

2 Comentarios

  1. 11

    Puede utilizar el siguiente:

    if (!StartActivity.this.isFinishing())
    {
    //showdialog fragment
    }

    para comprobar si la actividad no está acabado justo antes de mostrar el cuadro de diálogo.

    Gracias por su respuesta, mi problema estaba en la CloseDialogRunnable, voy a actualizar esto con el trabajo de contestar.
    A mí me funciona esta solución.

    OriginalEl autor Arno

  2. 0

    Finalmente, la solución al problema es modificar el CloseDialogRunnable, aquí está el código de trabajo:

    public class CloseDialogRunnable implements Runnable {
    /**
    * http://stackoverflow.com/questions/5844308/removecallbacks-not-
    * stopping-runnable
    */
    private boolean killCloseActivityRunnable = false;
    public void killRunnable() {
    killCloseActivityRunnable = true;
    }
    @Override
    public void run() {
    if (killCloseActivityRunnable) {
    return;
    }
    if (getDialog() != null && getDialog().isShowing() && isResumed()) {
    try {
    dismiss();
    } catch (IllegalArgumentException e) {
    Log.e(TAG, "Error dismissing");
    }
    }
    }
    }
    IllegalArgumentException o IllegalStateException? Todo lo que están haciendo es tragar la excepción. Yo no creo que esto es realmente una solución. La solución sería evitar que la excepción.

    OriginalEl autor Guillermo Merino

Dejar respuesta

Please enter your comment!
Please enter your name here