对话框打开时检测后退按钮事件

时间:2018-04-13 04:49:52

标签: java android dialog back-button keyevent

我正在构建一个有2个对话框打开的应用程序,如果用户在某些对话框打开时按下后退按钮,我想要发生一些事情。但是,由于某种原因,当对话框打开时,后退按钮事件不会注册。我通过在onBackPressed()中登录来测试它,并且每当对话未打开并且我只是在主活动上时,日志就会出现在logcat上。但是,如果对话是开放的,我只是得到这个:

  

W / InputEventReceiver:尝试完成输入事件,但输入事件接收器已经被处理掉。

下面我列出了对话的代码:

    public void pair() {
        final Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();

        AlertDialog.Builder pairedList = new AlertDialog.Builder(this);
        pairedList.setTitle("Paired Devices");

        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_singlechoice);
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                arrayAdapter.add(device.getName());
            }
        }

        pairedList.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                mBluetoothAdapter.disable();
//                pair_dialog = false;
            }
        });

        pairedList.setPositiveButton("Pair New", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                startActivityForResult(new Intent(android.provider.Settings.ACTION_BLUETOOTH_SETTINGS), 0);
            }
        });

        pairedList.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
//                connect_dialog = true;
                String strName = arrayAdapter.getItem(which);
                AlertDialog.Builder builderInner = new AlertDialog.Builder(MainActivity.this);
                builderInner.setMessage(strName);
                builderInner.setTitle("Connect To:");
                builderInner.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        for (BluetoothDevice device : pairedDevices) {
                            if(device.getName().equals(strName)){
                                paired = device;
                                dialog.dismiss();
                            }
                        }
                    }
                });
                builderInner.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
//                        connect_dialog = false;
                        pairedList.show();
                    }
                });
                builderInner.show();
            }
        });
        pairedList.show();
//        pair_dialog = true;
    }

下面是我的onBackPressed()方法,它就在上面的方法之后。没有什么不寻常的,我不会想。

   @Override
    public void onBackPressed() {
        Log.e(TAG, "Back Button Pressed");
        super.onBackPressed();
    }

就像我说的,如果对话没有打开,日志在logcat中显示得很好但是如果对话是打开的,那就像后退按钮没有注册一样。

3 个答案:

答案 0 :(得分:1)

这对我有用......

       yuordialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface arg0, int keyCode,
                                 KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                   //your stuff....
                }
                return true;
            }
        });

答案 1 :(得分:0)

如果您已添加,

dialog.setCancelable(false);

将其更改为,

dialog.setCancelable(true);

实际上,setCancelable(false)取消了对话外的触摸事件并且也按下了。

答案 2 :(得分:0)

您也可以使用

builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialogInterface) {
        //your dismiss code here
    }
});

这会监听backpress事件并通过触摸关闭。