Android 如何处理对话框中的后退按钮?
我正在开发一个应用程序,当按下按钮时,它会打开一个对话框,其中包含OK和Cancel按钮 它很好用 当用户按下后退按钮时,我将按如下方式处理此问题Android 如何处理对话框中的后退按钮?,android,button,dialog,back,Android,Button,Dialog,Back,我正在开发一个应用程序,当按下按钮时,它会打开一个对话框,其中包含OK和Cancel按钮 它很好用 当用户按下后退按钮时,我将按如下方式处理此问题 public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { } return super.onKeyDown(keyCode, event); } 但是上面的方法没有被调用。我如何处
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
}
return super.onKeyDown(keyCode, event);
}
但是上面的方法没有被调用。我如何处理这个问题?试试这个
new AlertDialog.Builder(this).setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
Logger.d(TAG, "--------- Do Something -----------");
return true;
}
return false;
}
})
这是因为当您的对话框打开时,您的窗口将其焦点定位到对话框。
所以现在您必须在对话框中处理
键
。您需要重写OnCancel
方法。此方法在按Back键时调用。这里的代码对我来说是完美的
AlertDialog alertDialog;
alertDialog.setOnCancelListener(new OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog)
{
// TODO Auto-generated method stub
dialog.dismiss();
}
});
希望这对你有帮助,如果对你有帮助,就接受它
谢谢。听起来您想在创建对话框时设置OnCancelListener。看起来是这样的:
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//do whatever you want the back key to do
}
});
如果您使用的是DialogFragment,我可以告诉您 我注意到,
setOnCancelListener
不起作用,setOnKeyListener
起作用,但对我来说,有一个有趣的副作用,就是如果对话框有编辑文本,它会吞噬所有键。此代码起作用:
Dialog dlg = new Dialog(thisAct, R.style.DialogTheme);
dlg.setContentView(view);
dlg.setCancelable(false);
dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
dlg.setOnKeyListener((arg0, keyCode, event) -> {
Timber.d("onKey(%d)", keyCode);
//{home intercepting
if ((keyCode == KeyEvent.KEYCODE_HOME)) {
Timber.i("HOME pressed");
return true;
}
return true;
});
dlg.show();
在您自己的对话框中重写方法
onBackPressed()
,并在代码中使用它:
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context) {
super(context);
}
@Override
public void onBackPressed() {
// Do what you want
}
}
使用:
是否希望用户能够取消该对话框?或者你的onKeyDown部分是做什么的?@kiran::你能再清楚一点吗?为什么我不能在生成器中使用setOnCancelListener?没有必要关闭
对话框
<代码>完成()。此外,此方法可能会返回false
,以便能够捕获其他关键事件,我认为下面的alexc答案是更好的选择。我在答案中添加了和&event.getAction()==KeyEvent.ACTION\u UP
。如果没有它,代码块将执行两次。(向下键和向上键)。在本例中,它并不重要,但对于除finish()之外的其他操作,它可能非常重要。@dmmh如果不调用dialog.disease()
将导致内存泄漏。我确信您是对的,但在这种情况下,应该在上述代码中切换finish()
和dialog.disease()
。虽然正确,关于如何在对话框中处理键
,这个答案的信息量不大。这绝对是最好的答案。又好又简单。无需检测KeyEvent。太好了。我知道我来晚了,但我想指出点什么。此外,当用户单击对话框外的某个位置时,也会触发此操作。因此,如果您只需要覆盖back press选项,则这不是您要查找的。@user2520215如果您不希望在用户单击对话框外部时触发它,则应将dialog.SetCanceledOnTouchOut设置为(false)。这绝对是更好的答案。谢谢你指出。这无疑是一种更好的方法。如果在关键侦听器工作的情况下使用自定义视图(即不创建对话框,而只是从DialogFragment中继承),那么这似乎不起作用。
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context) {
super(context);
}
@Override
public void onBackPressed() {
// Do what you want
}
}
MyDialog dlg = new MyDialog(context);
dlg.show();