Pregunta

Comencé a usar DialogFragment, porque están trabajando bien a través de cambios de orientación y esas cosas. Pero hay un problema desagradable que encontré.

tengo AsyncTask que muestra el dialogfragmento de progreso y lo descarta onPostExecute. Todo funciona bien, excepto cuando onPostExecute sucede mientras la aplicación está en el fondo (después de presionar el botón de inicio, por ejemplo). Luego obtuve este error en DialogFragment Descalling - "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 el dialogfragment mientras la aplicación está en el fondo? Realmente no he trabajado mucho con fragmentos, así que creo que solo me estoy perdiendo algo.

¿Fue útil?

Solución

DialogFragment tiene un método llamado dismissAllowingStateLoss()

Otros consejos

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

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

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

Cuando quieras dismirar el diálogo, haga esta verificació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();
  }
  super.onResume();
}   

De esta manera, el cuadro de diálogo se descartará si es visible ... si no es visible, el diálogo se va a poner a continuación. El fragmento se vuelve visible (OnResume) ...

Esto es lo que tenía que hacer para lograr lo que quieres: tengo una actividad de fragmento en la que estaba mostrando un fragmento de diálogo llamado fragment_RedemptionPayment que se declara globalmente en la parte superior. El siguiente código descarta el DialogFragment Si se mostraba antes de que la actividad vaya en el fondo y vuelva a 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 dialogfragment, pero esa no es la más bonita de las soluciones.

A veces he notado que tengo que hacer cola mis acciones de diálogo para que el marco restaure el estado primero. Si puede obtener el looper actual (Activity.getMainLooper()) Y envuelva que en un manejador pueda intentar pasar su despido a la parte posterior de la cola publicando un corredor en esa cola.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top