2012-08-27 23 views
47

Estoy intentando evitar que se cierre un cuadro de AlertDialog al presionar el botón Atrás en Android. He seguido los dos métodos populares in this thread y con System.out.println puedo ver que en ambos casos el código se ejecuta. Sin embargo, el botón Atrás todavía cierra el cuadro de diálogo.Impedir que el botón Atrás cierre un cuadro de diálogo

¿Qué podría estar haciendo mal? En última instancia, estoy tratando de evitar que el botón Atrás 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" en para que la aplicación continúe

+1

Si requiere que un usuario acepte una licencia o exención de responsabilidad (o lo que sea), entonces ** DEBE ** permitir que se nieguen. Si hacen clic en el botón "ATRÁS", asegúrese de que su cuadro de diálogo de licencia/renuncia vuelva a aparecer la próxima vez que inicien la aplicación y una y otra vez hasta que acepten o eliminen la aplicación de su dispositivo. Si elige utilizar el enfoque sugerido por Sam, entonces ** DEBE ** proporcionar un botón 'Rechazar', pero luego volver a crear la licencia/exención de responsabilidad la próxima vez que inicie la aplicación. – Squonk

+1

Quitaría una aplicación que me da "aceptar" como la única opción ... ¡y ni siquiera pienso en deshabilitar el botón de inicio! – WarrenFaith

+0

La aplicación se puede cerrar presionando el botón de inicio, pero esencialmente la aplicación no puede avanzar más allá de la exención de responsabilidad si no se acepta la licencia. @Squonk, mencionas que * debo * permitirles que se nieguen; ¿Es esto un problema legal? es decir, ¿existe una ley según la cual el software debe ser utilizable (si se ha pagado) sin aceptar el acuerdo de licencia? nótese bien. Ya tengo un botón "rechazar" y al presionarlo aparece un Toast() que dice que debes aceptar el acuerdo para utilizar la aplicación. El cuadro de diálogo persiste hasta que se presione Aceptar. – CaptainProg

Respuesta

110

simplemente usar la función setCancelable():

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

Esto evita que el botón de retroceso de cerrar el diálogo, pero deja el botón "negativo" intacta, si opta por utilizarlo.


Mientras que cualquier usuario que no quiere aceptar las condiciones del servicio puede empujar el botón de inicio, a la luz del comentario de Squonk, aquí dos maneras más para evitar que "dar marcha atrás" del acuerdo de usuario. Uno de ellos es un simple "rechazar" botón y los otros reemplazos en 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; 
      } 
     }); 
+0

funciona, gracias –

+18

Además, si utiliza un 'DialogFragment', debe llamar a' setCancelable' en eso y no en el 'Dialog' sí mismo – Kuffs

+0

muchas gracias @Kuffs. Estaba configurándolo en el Diálogo y preguntándome por qué no funciona. – sasikt

10

Para evitar que el botón de retroceso cierra un diálogo (sin depender de la actividad), sólo el código siguiente:

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; 
    } 
}); 
+1

Funcionó muy bien en mi caso. Tuve que cargar un 'WebView' en mi aplicación. Tenía que verificar 'canGoBack()' y cerrar el diálogo si era falso. – pandalion98

1

uso setCancelable(false)

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

Sólo esto funcionó para mí:

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é una línea dialog.setCanceledOnTouchOutside(false);, por lo que al tocar fuera del cuadro de diálogo tampoco se cierra.

0

Al utilizar DialogFragment tendrá que llamar setCancelable() en el fragmento, no el diálogo:

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

    return dialog; 
} 

Calling dialog.setCancelable() parecen tener ningún efecto. Parece que DialogFragment no tiene en cuenta la configuración del diálogo para cancelabilidad.

Cuestiones relacionadas