full custom create codepath activity android dialog

android - custom - Devolución de llamada cuando se desactiva DialogFragment



input dialog fragment android (3)

El ejemplo de Tyler fue el único ejemplo que pude encontrar que realmente funcionó. Lo único que debe cambiarse para que el ejemplo funcione es la llamada al método DismissListner en la clase DialogFragment. Lo tiene como:

dialogFragementObject.DismissListner(closeListener);

Esto solo necesita ser un elenco para cualquiera que sea el nombre de clase de ese DialogFragment. Por ejemplo:

((MyDialogFragment)dialogFragementObject).DismissListner(closeListener);

Quiero iniciar un cuadro de diálogo con un diseño personalizado, que he implementado a través de un DialogFragment. (Básicamente, solo cambié onCreateView () y agregué controladores de botones). El diálogo permite al usuario cambiar rápidamente una configuración importante.

Este diálogo será lanzado desde varias actividades diferentes. Las diferentes actividades no tienen mucho en común, excepto que deben actualizarse después de que el usuario realice un cambio en la configuración. No necesitan obtener ninguna información del diálogo; simplemente necesitan saber cuándo está cerrado (descartado).

Lo que he intentado

Intenté actualizar la actividad en onResume (), pero al iniciar y cerrar un diálogo parece que nunca se llama a este método. (Así que no estoy seguro de por qué existe, pero ese es probablemente un tema para otra pregunta).

A continuación, intenté agregar un DialogInterface.OnDismissListener al diálogo:

public static void showMyDialog(OnDismissListener listener, Activity activity) { DialogFragment fragment = new MyDialogFragment(); fragment.show(activity.getFragmentManager(), "date"); activity.getFragmentManager().executePendingTransactions();//A fragment.getDialog().setOnDismissListener(listener);//B }

Cuando originalmente dejé la línea A, obtuve una NullPointerException en la línea B porque el diálogo es nulo en ese punto. Siguiendo el consejo de esta respuesta SO , puse la llamada a executePendingTransaction (). Esto causa una excepción IllegalStateException en la línea B, con el mensaje "OnDismissListener ya fue tomado por DialogFragment y no se puede reemplazar". También intenté poner setOnDismissListener () antes de la llamada para mostrar (), pero eso siempre causó una NullPointerException.

Luego leí esta otra respuesta SO , que dice que el autor de la pregunta original estaba "llamando a getDialog () demasiado pronto en el ciclo de vida de DialogFragment". Así que intenté agregar un constructor a mi DialogFragment:

public MyDialogFragment(SomeCallback illTakeAnythingICanGet) { //I''ll store the callback here and call it later }

Desafortunadamente, agregar un constructor hizo que Android Lint se volviera loca con una advertencia fatal, y cuando lo busqué, encontré un comentario en esta pregunta que parece decir que este enfoque hará que sea imposible tratar con el usuario girando la pantalla mientras el diálogo Esta abierto.

La pregunta

¿Cómo puede una actividad descifrar cuándo un DialogFragment se ha cerrado (se ha descartado) de una manera que no rompa mi aplicación si el usuario gira la pantalla? ¿Debo usar otra cosa además de un DialogFragment?


Esta es solo una explicación más larga del comentario de Harism en caso de que alguien más tenga el mismo problema que yo.

Puedes lograr lo que quería creando una interfaz como esta:

public interface MyDialogCloseListener { public void handleDialogClose(DialogInterface dialog);//or whatever args you want }

Haga que la actividad que inicia su cuadro de diálogo (DialogFragment) implemente esta interfaz. Entonces dale a ese DialogFragment el siguiente método:

public void onDismiss(DialogInterface dialog) { Activity activity = getActivity(); if(activity instanceof MyDialogCloseListener) ((MyDialogCloseListener)activity).handleDialogClose(dialog); }


Más código explicativo para que alguien haga lo mismo.

Crea la interface como:

package com.example.dialoglistener; import android.content.DialogInterface; public interface MyDialogCloseListener { public void handleDialogClose(DialogInterface dialog); }

Implementar la interfaz en la actividad como:

MyDialogCloseListener closeListener = new MyDialogCloseListener() { @Override public void handleDialogClose(DialogInterface dialog) { //do here whatever you want to do on Dialog dismiss } };

Escribe un DismissListener en DialogFragement como

public void DismissListener(MyDialogCloseListener closeListener) { this.closeListener = closeListener; }

llame a DismissListener desde su actividad como:

dialogFragementObject.DismissListener(closeListener);

y finalmente escribir el método onDismiss

@Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); if(closeListener != null) { closeListener.handleDialogClose(null); } }