在Android上显示对话框会禁用Windows焦点,因此onKeyDown不会监听触摸事件

问题描述 投票:0回答:1

我正在使用以下代码来监听活动中的音量按钮,该按钮实现了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

java android android-layout
1个回答
0
投票

[创建警报时,您可以像这样设置窗口的标志:

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

© www.soinside.com 2019 - 2024. All rights reserved.