代码之家  ›  专栏  ›  技术社区  ›  user2161312

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

  •  2
  • user2161312  · 技术社区  · 7 年前

    我正在构建一个有2个打开的对话的应用程序,如果用户在某些对话打开时按下后退按钮,我希望发生一些事情。然而,由于某些原因,当对话打开时,后退按钮事件没有注册。我将一个日志放在onBackPressed()中进行测试,每当对话没有打开并且我只是在主活动上时,日志就会显示在logcat上。然而,如果对话是开放的,我只会得到:

    带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 回复  |  直到 7 年前
        1
  •  6
  •   Naveen Dew    7 年前

    这对我有用。。。

           yuordialog.setOnKeyListener(new Dialog.OnKeyListener() {
    
                @Override
                public boolean onKey(DialogInterface arg0, int keyCode,
                                     KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_BACK) {
                       //your stuff....
                    }
                    return true;
                }
            });
    
        2
  •  0
  •   Khyati Chitroda    7 年前

    如果您已添加,

    dialog.setCancelable(false);
    

    将其更改为,

    dialog.setCancelable(true);
    

    实际上,setCancelable(false)会取消对话框外的触摸事件,也会取消反按。

        3
  •  0
  •   AS Mackay Kushan Gowda    5 年前

    您还可以使用

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

    这将侦听两个backpress事件并通过触摸解除。