2012-08-27 66 views
47

我试图防止在Android中按下后退按钮时关闭AlertDialog框。我遵循了两种流行的方法in this thread和System.out.println我可以看到,在这两种情况下代码都会执行。但是,后退按钮仍然关闭对话框。防止后退按钮关闭对话框

我会做什么错?最终,我试图阻止后退按钮关闭一个对话框 - 这是一个免责声明,该应用程序第一次运行时显示,我不希望用户有任何选项,但要按“接受”按钮为了继续应用程序的订单。

+1

如果您需要用户接受许可证或免责声明(或其他),那么您必须**允许他们拒绝。如果他们点击“返回”按钮,那么请确保您的许可证/免责声明对话框在他们下次启动应用程序时再次出现,并一次又一次,直到他们接受或从设备中删除应用程序。如果您选择使用Sam建议的方法,那么您必须**提供“拒绝”按钮,但在下次启动应用程序时重新创建许可证/免责声明。 – Squonk

+1

我会删除一个让我“接受”为唯一选项的应用程序......并且甚至不考虑禁用主页按钮! – WarrenFaith

+0

该应用程序可以通过按主页按钮关闭,但实质上,如果许可证未被接受,应用程序无法通过免责声明。 @Squonk,你提到我*必须*允许他们拒绝;这是一个法律问题吗?即是否有一项法律规定软件必须可用(如果已经支付)而不接受许可协议?注:我已经有一个“拒绝”按钮,并按下此按钮会弹出一个Toast(),表示您必须接受该协议才能使用该应用程序。该对话框因此一直持续到接受按下。 – CaptainProg

回答

110

只需使用setCancelable()功能:

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

这样可以防止关闭对话框返回按钮,但留下的“负”按钮不变,如果您选择使用它。


虽然不希望接受您的服务条款可以从用户协议的“回退”按home键,在湿眶客的评论来看,这里有两个更多的方式,以防止他们的任何用户。一个是简单的“拒绝”按钮和其他覆盖对话框中的后退按钮:

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

其工作,谢谢 –

+18

此外,如果使用'DialogFragment',你应该调用'setCancelable'而不是'Dialog'本身 – Kuffs

+0

非常感谢@Kuffs。我将它设置在对话框中,并想知道为什么它不起作用! – sasikt

10

为了防止后退按钮关闭对话框(不依赖于活动),只是下面的代码:

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

在我的情况下工作得很漂亮。我不得不在我的app上加载一个'WebView'。我必须检查'canGoBack()'并关闭对话框,如果它是错误的。 – pandalion98

1

使用setCancelable(false)

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

只有这个工作对我来说:

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; 

正如您所看到的,我还添加了一条dialog.setCanceledOnTouchOutside(false);行,因此在对话框外部轻敲不会导致它被关闭。

0

当使用DialogFragment您需要调用setCancelable()的片段,而不是对话框:

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

    return dialog; 
} 

调用dialog.setCancelable()似乎没有任何效果。看起来DialogFragment没有注意到对话框的可取消设置。

相关问题