full codepath activity android android-fragments android-dialogfragment dialogfragment

android - codepath - commitAllowingStateLoss en DialogFragment



input dialog fragment android (3)

Tengo una IllegalStateException al mostrar un DialogFragment :

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

Sé por qué está sucediendo, pero quiero usar commitAllowingStateLoss para mostrar el diálogo anulando la función de visualización de DialogFragment:

public void show(FragmentManager manager, String tag) { mDismissed = false; mShownByMe = true; FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commit(); //replace it by commitAllowingStateLoss }

pero no mShownByMe variables mDismissed y mShownByMe , ¿cómo puedo acceder a esas variables para modificarlas como lo hizo su padre?


Creo que para evitar lanzar IllegalStateException en DialogFragment podría ser mejor usar:

YourDialogFragment dialogFragment = new YourDialogFragment (); fragmentManager.beginTransaction().add(dialogFragment, YourDialogFragment .TAG_FRAGMENT).commitAllowingStateLoss();

En lugar de usar show() en DialogFragment .


La solución sobre commitAllowingStateLoss funciona si su DialogFragment no tiene un estado que guardar, de lo contrario, se perderán, como se indica en el nombre de la función. Pero creo que en la mayoría de los casos tenemos un estado para guardar, ese es el mayor beneficio de DialogFragment: Android lo recrea y mantiene su estado automáticamente.

Una solución mejor sería verificar si el proceso de recreación se realizó, si no, luego se devuelve al llamante, que es una Actividad o una Actividad de fragmento, debe marcarla y llamar a la función de mostrar más adelante en su onPostResume () o enResumeFragments () devolución de llamada, que podemos asegurarnos de que todos los fragmentos sean recreados.

Aquí hay un show () invalidado de una subclase de DialogFragment:

public boolean show(FragmentManager fragmentManager) { if (fragmentManager.isStateSaved()) return false; show(fragmentManager, tagName); return true; }


fragmento de diálogo de origen

public void show(FragmentManager manager, String tag) { mDismissed = false; mShownByMe = true; FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commit(); //replace it by commitAllowingStateLoss }

no sé mDismissed , mShownByMe utiliza las variables, por lo que debería ser mejor si se anula el método show(FagmentManager, String) de DialogFragment y funciona bien conmigo

override fun show(manager: FragmentManager?, tag: String?) { if (manager?.isDestroyed == false && !manager.isStateSaved) { super.show(manager, tag) } }

isStateSaved disponible desde appcompat> = 26.0.0 o androidx