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