open full from ejemplo custom activity android android-fragments android-dialog android-dialogfragment

android - full - dialogfragment kotlin



La forma correcta de descartar DialogFragment mientras la aplicación está en segundo plano (4)

Empecé a usar DialogFragment, porque están funcionando muy bien a través de cambios de orientación, y cosas así. Pero hay un desagradable problema que encontré.

Tengo AsyncTask que muestra progreso DialogFragment y lo descarta en onPostExecute . Todo funciona bien, excepto cuando onPostExecute ocurre mientras la aplicación está en segundo plano (después de presionar el botón Inicio, por ejemplo). Luego obtuve este error en DialogFragment descartando: " Can not perform this action after onSaveInstanceState ". Doh. Los diálogos regulares funcionan bien. Pero no FragmentDialog.

Entonces, me pregunto, ¿cuál es la forma correcta de descartar DialogFragment mientras la aplicación está en segundo plano? Realmente no he trabajado mucho con Fragments, así que creo que me estoy perdiendo algo.


Esto es lo que hice (df == dialogFragment) :

Asegúrese de llamar al diálogo de esta manera:

df.show(getFragmentManager(),"DialogFragment_FLAG");

Cuando desee cerrar el cuadro de diálogo, haga esta comprobación:

if(df.isResumed()){ df.dismiss(); } return;

Asegúrese de tener lo siguiente en el método onResume () de su fragmento (no df)

@Override public void onResume(){ Fragment f= getFragmentManager().findFragmentByTag("DialogFragment_FLAG"); if (f!= null) { DialogFragment df = (DialogFragment) f; df.dismiss(); getFragmentManager().beginTransaction().remove(f).commit(); } super.onResume(); }

De esta forma, el diálogo se cerrará si está visible. Si no está visible, el diálogo se eliminará y el fragmento se volverá visible (onResume) ...


Esto es lo que tuve que hacer para lograr lo que deseaba: tengo una actividad de Fragmento en la que estaba mostrando un fragmento de diálogo llamado fragment_RedemptionPayment que está declarado globalmente en la parte superior. El siguiente código descarta el DialogFragment si se muestra antes de que la actividad entre en segundo plano y vuelva a estar en primer plano.

@Override public void onResume() { super.onResume(); if(fragment_RedemptionPayment.isVisible()){ fragment_RedemptionPayment.dismiss(); } }


Una solución que podría funcionar es establecer Fragment.setRetainInstance(true) en su fragmento de diálogo, pero esa no es la solución más bonita.

A veces me he dado cuenta de que tengo que poner en cola mis acciones de diálogo para permitir que el framework restablezca el estado primero. Si puede hacerse con el Looper actual (Activity.getMainLooper()) y envolverlo en un Handler, podría intentar pasar su despido al final de la cola publicando un ejecutable en esa cola.

A menudo termino usando un fragmento separado que retaininstance(true) ResultReceiver retaininstance(true) que tiene un ResultReceiver . Así que transfiero ese receptor de resultados a mis trabajos y manejo las devoluciones de llamada en su recepción (a menudo como enrutador para otros receptores). Pero eso podría ser un poco más trabajo de lo que vale si está utilizando tareas asíncronas.


DialogFragment tiene un método llamado dismissAllowingStateLoss()