最近做Android项目时,需要使用外接扫码枪扫描条码,并且接收条码输入的EditText同时还要能接收商品名称的输入,在开发调试的过程中发现,使用扫码枪时会出现条码信息丢失,或者扫码输入过程中出现两次Enter的情况。

问题1:

扫码枪扫码后,会⾃动调起系统软键盘

扫码枪相当于外接键盘,对于外接键盘不同的Android设备表现不同,⼀般我们期望外接键盘与系统键盘互斥。看⼚商是否在Framework有做过适配处理。

若要不弹出系统软键盘,可禁⽤Activity软键盘:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

该设置会导致界面里面所有需要弹出软键盘的控件均无法显示软键盘。当我们需要清除该状态时,可以在输入控件的Touch事件里面进行解除

EditText.setOnTouchListener(new OnTouchListener() {

    @Override

    public boolean onTouch(View v, MotionEvent event) {

        // TODO Auto-generated method stub

        getWindow().clearFlags(

        WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

        return false;

    }

});

解除禁用

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)

问题2:

扫码枪扫码后,⾃动弹出软键盘,同时EditText显⽰内容有丢失或代码监听扫码事件,监听到的KeyEvent.getKeyCode是KeyEvent.KEYCODE_ENTER

解决办法:

由于扫码枪与系统软键盘冲突,部分数据被系统软键盘拦截,禁⽤系统软件盘可解决此问题
 

问题3:

由于扫码枪与系统软键盘冲突,部分数据被系统软键盘拦截,禁⽤可解决此问题
 

解决办法:

扫到的码最后⼀般带有回车符,导致EditText失去焦点。可给EditText配置如下next系列属性,使其下个焦点仍然指向⾃⼰

<EditText
id="@+id/scan_code"
layout_width="300px"
layout_height="100px"
textSize="20sp"
nextFocusDown="@id/scan_code"
nextFocusForward="@id/scan_code"
nextFocusLeft="@id/scan_code"
nextFocusRight="@id/scan_code"
nextFocusUp="@id/scan_code"
nextClusterForward="@id/scan_code"/>

总结:

Android设备外接扫码枪,在EditText接收扫码输入时,不同设备的表现不同,有些设备的Framework层未做外接键盘和系统键盘冲突的处理逻辑,可能会导致扫码输入信息错误的情况。

1、使用中文输入法(百度中文输入法,谷歌中文拼音输入法)中文输入方式时(搜狗输入法无此问题),使用扫码枪向EditText输入扫码信息,会出现多次回车,或者输入不完整的情况,此时可尝试将EditText的输入内容限制为Number纯数字输入,避免中文导致的问题;

2、系统软键盘和外接键盘(扫码枪实际就是一种外接键盘)冲突,导致扫码枪输入信息错误,此时可限制系统键盘弹出的方式解决;