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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!