所以我有以下代码,用于区分软键盘输入和蓝牙条形码扫描器...
if(event.getAction()==KeyEvent.ACTION_DOWN){
if(event.getDeviceId()==-1) //from soft keyboard
return super.dispatchKeyEvent(event);
char pressedKey = (char) event.getUnicodeChar();
barCode += pressedKey;
}
if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
if(event.getDeviceId()==-1) //from keyboard
return super.dispatchKeyEvent(event);
String giftCardUPC = barCode.replaceAll("[^\\d.]", "");
fragmentProShopGiftCard.etUPCCode.setText(giftCardUPC);
barCode="";
}
想法是条形码扫描仪具有设备ID,而软键盘则没有。现在的问题是,我有一个活动同时支持HARD蓝牙键盘,软键盘(如果他们不使用硬键盘)以及条形码扫描仪。
有什么方法可以区分dispatchKeyEvent上的两个硬件设备吗?
答案 0 :(得分:0)
如果活动(或上一个活动或片段)中的其他字段需要用户执行手动输入,则可以在此处检查并保存设备ID,然后将其与用于您感兴趣的输入。
另一种可能性是记录关键事件的时间。条形码读取器的速度将比任何人都快。
答案 1 :(得分:0)
这就是我最终要做的...我注意到条形码扫描仪的第一个条目始终是KEYCODE_LEFT_SHIFT的KeyCode。...
String barCode = "";
boolean barCodeMode = false;
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getAction()==KeyEvent.ACTION_DOWN){
if(event.getDeviceId()==-1) { //from soft keyboard
return super.dispatchKeyEvent(event);
}else if(event.getKeyCode() == KeyEvent.KEYCODE_SHIFT_LEFT || barCodeMode){ //from barcode scanner
barCodeMode = true;
char pressedKey = (char) event.getUnicodeChar();
barCode += pressedKey;
}else{ //from hard keyboard
return super.dispatchKeyEvent(event);
}
}
if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
if(event.getDeviceId()==-1) { //from soft keyboard
return super.dispatchKeyEvent(event);
}else if(barCodeMode){ //from barcode scanner
String giftCardUPC = barCode.replaceAll("[^\\d.]", "");
fragmentProShopGiftCard.etUPCCode.setText(giftCardUPC);
barCode="";
barCodeMode = false;
}else{ //from hard keyboard
return super.dispatchKeyEvent(event);
}
}
}