Android输入法与扫码枪冲突问题解决方案

1.输入法与扫码枪冲突缘由
在Android中,有时一个文本输入框EditText获得焦点后用扫码枪进行扫码输入,而不是通常的用输入法输入,这时EditText对输入法和扫码枪的处理可能存在冲突,造成输入异常。

2.解决方案

这时可以使用自定义EditText来解决,代码如下。

1)ScannerEditText.java

package com.scan_ime;



import android.content.Context;

import android.support.v7.widget.AppCompatEditText;

import android.util.AttributeSet;

import android.view.KeyEvent;







/**

 * 支持扫码输入的AppCompatEditText

 * 解决扫码枪与中文输入法冲突的问题

 */

public class ScannerEditText extends AppCompatEditText {

    // 扫码结果

    public String mResult = "";

    // 回调接口

    public ScanResultListener mScanResultListener;

    // 设置扫码回调主入口

    public void setScan(ICommonCallback<String> callback){

        // 设置扫码回调接口

        setScanResultListener(new ScannerEditText.ScanResultListener() {

            @Override

            public void onScanCompleted(String result) {

                String ultimate= Constants.ES;

                if (null!=result){

                    ultimate=result.trim();

                } else {

                    ultimate=Constants.ES;

                }

                //过滤掉扫码枪返回的包含\n或\r等错误字符

                ultimate=ultimate.replace("\n", Constants.ES);

                ultimate=ultimate.replace("\r", Constants.ES);

                setText(ultimate);

                //回调到外部处理

                if (null!=callback){

                    callback.onSuccess(ultimate);

                }

            }

        });

    

    }



    // 设置扫码之后处理的监听器

    public void setScanResultListener(ScanResultListener scanResultListener) {

        mScanResultListener = scanResultListener;

    }

 

    public ScannerEditText(Context context) {

        super(context);

    }

 

    public ScannerEditText(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

 

    public ScannerEditText(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

    }



    // 在输入法IME处理之前进行操作

    @Override

    public boolean dispatchKeyEventPreIme(KeyEvent event) {

         // 若是输入法正常输入,则不处理

        if("Virtual".equalsIgnoreCase(event.getDevice().getName())) return super.dispatchKeyEventPreIme(event);

        // 如果想过滤特殊输入设备,则可使用event.getDevice()中的属性过滤

        // 并在不满足过滤条件后return super.dispatchKeyEventPreIme(event);

        if (0 == event.getUnicodeChar()) return true;

 

        // 每次按键后累计字符

        if (event.getAction() == KeyEvent.ACTION_DOWN) {

            mResult += (char) event.getUnicodeChar();

        }

        // 扫码枪默认使用KEYCODE_ENTER作为结束标志

        if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {

            // 回调到外部进行处理

            if (mScanResultListener != null) mScanResultListener.onScanCompleted(mResult);

            mResult = "";

        }

 

        return true;

    }

 

    // 扫码结果回调

    public interface ScanResultListener{

        void onScanCompleted(String result);

    }

}

2)ICommonCallback.java

 

// 通用泛型回调

public interface ICommonCallback<T> {

    // 回调成功处理函数

    void onSuccess(T t);

    // 回调失败处理函数

    void onFailure(Throwable t);

}


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值