为什么未调用dispatchKeyEvent方法?

时间:2015-12-07 04:34:35

标签: android keyevent

我的活动会显示一个ShowcaseView,它会添加到装饰视图((ViewGroup) activity.getWindow().getDecorView()).addView(mShowcaseView); ,我想检测关键事件以处理某些事情,所以我覆盖dispatchKeyEvent()来做我想要的事情。但似乎dispatchKeyEvent()方法永远不会被调用,更糟糕的是,PhoneWindow.DecorView#dispatchKeyEvent()没有被调用,我不知道为什么,请帮助我。

感谢:。)

这是我的ShowcaseView简要源代码。

public class ShowcaseView extends FrameLayout {
    public ShowcaseView(Context context) {
        super(context);
        init(context);
    }

    public ShowcaseView(Context context, AttributeSet attrs) {
       super(context, attrs);
       init(context);
    }

    public ShowcaseView(Context context, AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
       init(context);
    }

    private void init(Context context) {
        setWillNotDraw(false);
        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
        setFocusable(true);
        setEnabled(true);
    }

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    Log.d("Showcase", "dispatchKeyEvent: called");
    super.dispatchKeyEvent(event);
    return executeKeyEvent(event);
}

private boolean executeKeyEvent(KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_UP
            && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER) {
        hide();
    }
    return true;
}
}

1 个答案:

答案 0 :(得分:0)

根据https://developer.android.com/training/keyboard-input/commands.html

注意:使用KeyEvent类和相关API处理键盘事件时,您应该期望此类键盘事件仅来自硬件键盘。您不应该依赖于接收软输入法(屏幕键盘)上的任何键的键事件。

要从屏幕键盘发送关键事件,您可以将textWatcher添加到editText。

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

但我无法在您的代码段中看到输入字段。