我试图覆盖音量按钮以充当向上/向下箭头键(即它们应该将焦点移动到我的所有活动可聚焦视图上。)
为此,我超越了我的活动dispatchKeyEvent()
方法注意我也尝试过onKeyDown()
但我的音量键事件的某些部分仍然会通过系统,当您更改音量时,我的设备会发出声音反馈。我仍然可以听到嘟嘟声,但音量实际上并没有改变。切换到dispatchKeyEvent()
消除了系统发出的嘟嘟声。
这是我目前的dispatchKeyEvent()
method:
@Override
public boolean dispatchKeyEvent(KeyEvent ke){
int keyCode = ke.getKeyCode();
if(ke.getAction() == KeyEvent.ACTION_DOWN){
print("press " + keyCode);
if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
{
mTxt.postDelayed(pressDown, 600);
return true;
}else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP)
{
KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP);
dispatchKeyEvent(key);
return true;
}
}else if(ke.getAction() == KeyEvent.ACTION_UP){
print("release " + keyCode);
if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)
{
/*KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN);
dispatchKeyEvent(keyUp);*/
return true;
}else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP)
{
KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP);
dispatchKeyEvent(keyUp);
return true;
}
}
return super.dispatchKeyEvent(ke);
}
它现在的设置方式是使用不同的技术进行向上和向下,但都不能正确地转移焦点。对于向上键,我只需手动调用dispatchKeyEvent(),将方向键向上键传递给它,并执行与音量按钮相同的操作(因此,当我按下它时,它应该按下,当我释放它时,它应该释放)我的向上按钮的输出如下所示:
press 24
press 19
release 24
release 19
对于向下按钮,我稍微调整了它,因为我认为也许在音量释放之前按下方向键会破坏它,所以我制作了一个可运行的程序,它将同时按下和释放方向键按钮
pressDown = new Runnable(){
@Override
public void run(){
KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN);
dispatchKeyEvent(key);
KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN);
dispatchKeyEvent(keyUp);
}
};
我将其延迟了一秒,以便我有机会释放该卷。我的向下按钮的输出如下所示:
press 25
release 25
press 20
release 20
如果我将 USB 键盘插入我的设备并按箭头键,焦点会正确移动,并且我会看到 up 的输出:
press 19
release 19
对于向下:
press 20
release 20
唯一的区别(据我所知)是,当我按下键盘上的箭头时,焦点实际上会正确移动,而当我按下音量按钮(欺骗箭头按钮)时,焦点根本不会移动
我在这里忽略了什么吗?任何人都可以帮助我弄清楚如何欺骗我的活动的箭头键,以便他们真正正确地移动焦点?