1

我正在尝试覆盖音量按钮以充当向上/向下箭头键(即它们应该将焦点移动到我所有的活动焦点视图上。)

为此,我将覆盖我的活动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

唯一的区别(据我所知)是当我按下键盘上的箭头时焦点实际上移动正确,而当我按下音量按钮时根本不移动(这会欺骗箭头按钮)

我在这里忽略了什么吗?谁能帮我弄清楚如何在我的活动中欺骗箭头键,以便他们真正正确地移动焦点?

4

1 回答 1

2

我最终发现您需要使用 Instrumentation 类来发送关键事件,并且由于某种原因您必须在主线程之外进行。以下是将向下和向上发送的片段:

new Thread(new Runnable() {         
   @Override
   public void run() {                 
       new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
   }   
}).start();

new Thread(new Runnable() {         
   @Override
   public void run() {                 
       new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
   }   
}).start();

如果你使用这些独立的问题,它会正确地移动焦点。

于 2012-08-08T03:27:10.797 回答