Esta pregunta ha surgido varias veces y he leído todas las respuestas, pero no he visto realmente sólido manera de manejar esto. En mi solución, estoy usando los oyentes de la llamada Activity a la AlertDialog así:

public class MyDialogFragment extends DialogFragment {
public interface MyDialogFragmentListener {
public void onReturnValue(String foo);
}
public void init(boolean someValue)
{
sSomeValue = someValue;
listeners = new ArrayList<MyDialogFragmentListener>();
}
static boolean sSomeValue;
private static ArrayList<MyDialogFragmentListener> listeners;
public void addMyDialogFragmentListener(MyDialogFragmentListener l)
{
listeners.add(l);
}
public void removeMyDialogFragmentListener(MyDialogFragmentListener l)
{
listeners.remove(l);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.title)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
for (MyDialogFragmentListener listener : listeners) {
listener.onReturnValue("some value");
}
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//User cancelled the dialog
//Nothing to do but exit
}
});
if (sSomeValue) {
builder.setMessage(R.string.some_value_message);
} else {
builder.setMessage(R.string.not_some_value_message);
}
//Create the AlertDialog object and return it
return builder.create();
}
}

A continuación, en la llamada Activity, me instanciar el objeto normalmente, el paso de argumentos a través de init y establecer mi oyente.

Aquí está el problema: cuando gire el dispositivo y cambiar la orientación, mientras que el diálogo está abierto, tanto en el Activity y MyDialogFragment objetos re-creado. Para asegurarse de que los valores de entrada no obtener jodido, estoy configurando mi inicializa los valores como static. Esto se siente hacky a mí, pero ya no será solamente un ejemplo de diálogo en un momento, estoy bien con él. Donde entra el problema es con el valor de retorno. El original oyente llamado. Eso está bien porque el objeto todavía existe, pero si existe un requisito para la actualización de la interfaz de usuario en el Activity (que no hay), que no se actualiza porque la nueva Activity instancia es ahora el control de la interfaz de usuario.

Una solución que estoy considerando es de fundición getActivity() en la clase de diálogo para mi Activity y obligando al cuadro de diálogo para agregar una escucha, en lugar de tener la vocación Activity hacerlo. Pero esto sólo se siente como una bola de nieve de hacks.

¿Cuál es la mejor práctica para el manejo de este correctamente?

OriginalEl autor Eric Lange | 2012-11-17

3 Comentarios

  1. 21

    Usted está en el camino correcto, yo sigo el método recomendado por la Los Desarrolladores de Android – el Uso de DialogFragments artículo.

    Crear su DialogFragment y definir una interfaz en la que la Actividad se va a implementar, como se ha hecho anteriormente con este:

    public interface MyDialogFragmentListener {
    public void onReturnValue(String foo);
    }

    A continuación, en la DialogFragment cuando desea devolver el resultado a la Actividad de fundición de la actividad a la interfaz:

    @Override
    public void onClick(DialogInterface dialog, int id) {
    MyDialogFragmentListener activity = (MyDialogFragmentListener) getActivity();
    activity.onReturnValue("some value");
    }

    A continuación, en la Activity de implementar la interfaz y agarrar el valor:

    public class MyActivity implements MyDialogFragmentListener {
    ...
    @Override
    public void onReturnValue(String foo) {
    Log.i("onReturnValue", "Got value " + foo + " back from Dialog!");
    }
    }
    Ok, que parece la manera más fácil de ir de donde estoy, pero vamos me complique un poco. También tengo una situación en la que me inicie un diálogo desde dentro de otro cuadro de diálogo (como contraposición a una Actividad). En este caso, el primer cuadro de diálogo se escucha en el segundo. Cómo sería esto de la solución de trabajo en ese caso?
    Me gustaría probable que el uso de la interfaz para que el flujo de retorno del control de la Actividad y deje que se inicie la segunda DialogFragment. Suena como un problema interesante, ¿cuál es el caso?
    Tengo una Actividad con una lista de dispositivos. Cuando el usuario selecciona un dispositivo, aparece un cuadro de diálogo que muestra la información (estado, conectividad, etc.) para ese dispositivo. Entonces, el usuario puede optar por eliminar o cambiar el nombre del dispositivo. En el caso eliminar, me emergente de confirmación. En el cambio de nombre caso, yo abrirá un cuadro de diálogo preguntando por el nuevo nombre.
    Todo a la derecha. Yo estoy haciendo, como usted sugiere y triage de todas las devoluciones de llamada a través de la Actividad. Cada cuadro de Diálogo llamadas de vuelta a la Actividad durante el onCreate y establece una referencia estática a sí mismo, de modo que la Actividad tiene siempre el último objeto. Esto parece funcionar. Gracias!
    Impresionante, me alegro de que usted consiguió trabajo 🙂 No podría ser de otra manera para manejar cuidadosamente a través del diálogo existente, tendré que probarlo un día.

    OriginalEl autor antew

  2. 2

    Que se puede disparar una Intención desde el cuadro de Diálogo del onClickListner que la Actividad estará escuchando.

    Echa un vistazo a este tutorial en La radiodifusión y la Recepción de las Calidades de

    Esto parece el camino a seguir. Voy a probar esto. Gracias!
    De manera más profunda de leer, que esto parece el malo de casos de uso para la radiodifusión. La radiodifusión es la intención de inter-app de comunicación y requiere registrarse con el manifiesto para crear objetos que aún no existen. Antew la solución es, probablemente, la elección correcta para esto.
    Eric Lange, puede utilizar LocalBroadcastManager enviar «local» las emisiones en lugar de «global» de las emisiones. Para un paso a paso guía sobre cómo presentar una difusión local de un DialogFragment para ser recogido por un Activity, consulte aquí

    OriginalEl autor Akos Cz

  3. 0

    Muy viejo el post pero…

    Me había apropiado de variables en el cuadro de diálogo de la clase:

    int selectedFooStatus = 0; 

    Manipulado cuando el diálogo se interactuó con:

    .setSingleChoiceItems(FOO_CHOICES, -1, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    selectedFooStatus = which; 
    }})

    En el onclick llamar el método de eché el regreso fragmento adecuadamente y se utiliza un captador para devolver el valor.

        public void onDialogPositiveClick(DialogFragment dialog) {
    ChangeFooStatusDialog returnedDialog = (ChangeFooStatusDialog) dialog;
    this.fooStatus = returnedDialog.getSelectedFooStatus();
    }
    Esto no funciona para mí. Yo, personalmente, habría encontrado que es más útil si más código había sido siempre.

    OriginalEl autor Little-Jim

Dejar respuesta

Please enter your comment!
Please enter your name here