我正在尝试覆盖音量按钮以充当向上/向下箭头键(即它们应该将焦点移动到我所有的活动焦点视图上。)
为此,我将覆盖我的活动dispatchKeyEvent()
方法注意,我也尝试过onKeyDown()
,但我的音量键事件的某些部分仍在通过系统,当您更改音量时,我的设备有声音反馈。我仍然可以听到哔哔声,但实际上并没有改变音量。切换到dispatchKeyEvent()
消除来自系统的哔哔声。
这是我目前的dispatchKeyEvent()
方法:
@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() 将 d-pad 向上键和音量按钮上发生的相同操作传递给它(所以当我按下它应该按下,当我释放它应该释放)我的向上按钮输出如下所示:
press 24
press 19
release 24
release 19
对于向下按钮,我稍微调整了它,因为我认为可能是在音量释放之前发生了 dpad 按下的事实,所以我做了一个可运行的,可以同时按下和释放 dpad 按钮
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 键盘插入设备并按箭头键,焦点会正确移动,我会看到向上的输出:
press 19
release 19
和向下:
press 20
release 20
唯一的区别(据我所知)是当我按下键盘上的箭头时焦点实际上移动正确,而当我按下音量按钮时根本不移动(这会欺骗箭头按钮)
我在这里忽略了什么吗?谁能帮我弄清楚如何在我的活动中欺骗箭头键,以便他们真正正确地移动焦点?