我正在使用以下代码来监听活动中的音量按钮,该按钮实现了View.OnTouchListener:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
triggerFinalSoundDialogue(2);
}
if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)){
triggerFinalSoundDialogue(2);
}
return true;
}
问题是triggerFinalSoundDialogue创建了一个对话框,使窗口失去焦点,所以我得到了这个:
Cancelling event due to no window focus: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_VOLUME_DOWN, scanCode=114, metaState=0, flags=0x28, repeatCount=0, eventTime=15688166, downTime=15688002, deviceId=9, source=0x101 }
并且该活动停止收听音量触摸。我想在显示对话框时听一下,以便在对话框上调高音量
UPDATE:
public static AlertDialog showDialog(Context context, View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.MyDialogTheme);
AlertDialog alert = builder.create();
alert.setView(view);
return alert;
}
UPDATE:
根据上述答案,我做了:
dialogVolumeAllBinding = DialogVolumeAllBinding.inflate(LayoutInflater.from(StompaiMainActivity.this));
volumeDialog = UiUtil.showDialog(this, dialogVolumeAllBinding.getRoot());
Window window = volumeDialog.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
volumeDialog.show();
但是对话框仍然窃取了音量事件,我仍然得到: Cancelling event due to no window focus: KeyEvent
[创建警报时,您可以像这样设置窗口的标志:
public static AlertDialog showDialog(Context context, View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.MyDialogTheme);
AlertDialog alert = builder.create();
Window window = alert.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
alert.setView(view);
return alert;
}
使用FLAG_NOT_FOCUSABLE
标志将使您可以将触摸事件发送到警报后的活动。
每docs:
FLAG_NOT_FOCUSABLE
public static final int FLAG_NOT_FOCUSABLE
Window flag:此窗口永远不会获得按键输入焦点,因此用户无法向其发送按键或其他按钮事件。这些将改为转到其后面的任何可聚焦窗口。无论是否明确设置此标志,都将启用FLAG_NOT_TOUCH_MODAL。
设置此标志还意味着该窗口将不需要与软输入法进行交互,因此将对其进行Z排序和定位,而与任何活动的输入方法无关(通常这意味着它在输入上方被Z排序方法,因此它可以使用全屏显示内容,并在需要时覆盖输入法。您可以使用FLAG_ALT_FOCUSABLE_IM修改此行为。* @apiSince 1