studio programacion herramientas fundamentos con avanzado aplicaciones android back

programacion - manual de android en pdf



Impedir que el botón Atrás cierre un cuadro de diálogo (6)

Estoy tratando de evitar que se cierre un cuadro de AlertDialog al presionar el botón Atrás en Android. He seguido los dos métodos populares en este hilo , y con System.out.println puedo ver que en ambos casos se ejecuta el código. Sin embargo, el botón Atrás sigue cerrando el cuadro de diálogo.

¿Qué podría estar haciendo mal? En última instancia, estoy tratando de evitar que el botón de retroceso cierre un cuadro de diálogo: es un descargo de responsabilidad que se muestra la primera vez que se ejecuta la aplicación y no quiero que el usuario tenga otra opción que presionar el botón "Aceptar" Orden para que la aplicación continúe.


Cuando utilice DialogFragment , deberá llamar a setCancelable() en el fragmento, no al diálogo:

@Override public Dialog onCreateDialog(Bundle savedInstanceState) { dialog = new ProgressDialog(getActivity()); dialog.setIndeterminate(true); dialog.setMessage(...); setCancelable(false); return dialog; }

Llamar a dialog.setCancelable() parece no tener efecto. Parece que DialogFragment no se da cuenta de la configuración del diálogo para la cancelación.


En JQuery Mobile, una ventana emergente agrega un hash a la url, el siguiente código permite que la parte posterior rechace la ventana emergente cuando está abierta y regrese a la aplicación cuando está cerrada. Podría usar la misma lógica para un marco ui personalizado.

@Override public void onBackPressed() { // check if modal is open #&ui-state=dialog if (webView.getVisibility() == View.VISIBLE && webView.getUrl().contains("#&ui-state=dialog")) { // don''t pass back button action if (webView.canGoBack()) { webView.goBack(); } } else { // pass back button action super.onBackPressed(); } }


Para evitar que el botón Atrás cierre un Diálogo (sin depender de la Actividad), solo el siguiente código:

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { // Prevent dialog close on back press button return keyCode == KeyEvent.KEYCODE_BACK; } });


Simplemente use la función setCancelable() :

AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(false);

Esto evita que el botón Atrás cierre el cuadro de diálogo, pero deja el botón "negativo" intacto si elige usarlo.

Si bien cualquier usuario que no quiera aceptar sus términos de servicio puede presionar el botón de inicio, a la luz del comentario de Squonk, aquí hay dos formas más para evitar que se "retiren" del acuerdo de usuario. Uno es un simple botón "Rechazar" y el otro anula el botón "Atrás" en el diálogo:

builder.setNegativeButton("Refuse", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) finish(); return false; } });


Solo esto me funcionó:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(title); builder.setMessage(content); /** * Make it when the Back button is pressed, the dialog isn''t dismissed. */ builder.setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { Utilities.makeToast(getContext(), "There is no way back!"); return true; // Consumed } else { return false; // Not consumed } } }); Dialog dialog = builder.create(); /** * Make it so touching on the background activity doesn''t close the dialog */ dialog.setCanceledOnTouchOutside(false); return dialog;

Como puede ver, también agregué un dialog.setCanceledOnTouchOutside(false); la línea, por lo que tocar fuera del cuadro de diálogo tampoco hace que se cierre.


Utilice setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance(); sampleDialog.setCancelable(false); sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());