为什么没有调用 View dispatchKeyEvent 方法?
Why View dispatchKeyEvent method not called?
我的 activity 会显示一个添加到装饰视图的 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;
}
}
根据https://developer.android.com/training/keyboard-input/commands.html:
注意:当使用 KeyEvent class 和相关 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) {
}
});
但是我在你的代码片段中看不到输入字段。
我的 activity 会显示一个添加到装饰视图的 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;
}
}
根据https://developer.android.com/training/keyboard-input/commands.html:
注意:当使用 KeyEvent class 和相关 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) {
}
});
但是我在你的代码片段中看不到输入字段。