我试图覆盖音量按钮以用作上/下箭头键(即它们应将焦点移到我所有活动的可聚焦视图上.)
为此,我重写了我的活动dispatchKeyEvent()方法,请注意,我也尝试了onKeyDown(),但是我的音量键事件的某些部分仍通过系统,当您更改音量时,我的设备具有可听见的反馈.我仍然可以听到蜂鸣声,但是音量实际上并未更改.切换到dispatchKeyEvent()消除了系统发出的提示音.
这是我当前的dispatchKeyEvent()方法:
@OverrIDepublic 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 24press 19release 24release 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 25release 25press 20release 20
如果我将USB键盘插入设备并按箭头键,焦点将正确移动,并且我看到向上的输出:
press 19release 19
而下来:
press 20release 20
唯一的区别(据我所知)是,当我按键盘上的箭头时焦点实际上正确移动,而当我按音量按钮(欺骗箭头按钮)时焦点根本不移动.
我在这里俯瞰什么吗?谁能帮助我弄清楚如何欺骗我的活动的箭头键,以便他们实际上可以正确地移动焦点?
解决方法:
我最终发现,您需要使用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();
如果您使用这些insdIE从问题中覆盖的dispatchKeyEvent,它将正确地移动焦点.
总结以上是内存溢出为你收集整理的如何欺骗箭头键到我在Android上的活动全部内容,希望文章能够帮你解决如何欺骗箭头键到我在Android上的活动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)