原理
扫描枪模拟键盘输入,会在有焦点的 EdtiText 中输入文本,输入结束通常会添加回车换行。
使用
界面不显示输入框,但是希望使用扫描枪
- 将 EditText 宽高分别设置为 1px;
- EditText 调用
requestFocusFromTouch()
获取焦点。
注意点:
- 如果设置了
inputType
属性,那么也需要设置disgits
属性,否则会出现获取不到焦点的情况; - 可能导致系统键盘弹出,如果不想弹出键盘,使用屏蔽键盘的 EditText 控件:
public class NoImeEditText extends AppCompatEditText {
public NoImeEditText(Context context) {
super(context);
}
public NoImeEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoImeEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onCheckIsTextEditor() {
return false;
}
}
添加监听获取输入内容
public abstract class BaseScanWatcher extends TextWatcher {
private static final String EMPTY = "";
private EditText mEditText;
protected BaseScanWatcher(EditText editText) {
mEditText = editText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
String content = s.toString();
if (content.endsWith(LF) || content.endsWith(CR) || content.endsWith(CRLF)) {
handleContent(content);
} else if (TextUtils.isEmpty(content)) {
// 输入内容为空也处理扫描结果(处理 EditText 点击了清除按钮的情况)
handleContent(EMPTY);
}
}
private void handleContent(String content) {
String result = content
.replace(LF, EMPTY)
.replace(CR, EMPTY)
.replace(CRLF, EMPTY);
onScanResult(result);
mEditText.removeTextChangedListener(this);
if (clearTextOnResult()) {
mEditText.setText(EMPTY);
} else {
mEditText.setText(result);
mEditText.setSelection(result.length());
}
mEditText.addTextChangedListener(this);
}
@Override
public void afterTextChanged(Editable s) {
}
/**
* 处理扫描结果
*
* @param scanResult 扫描结果
*/
public abstract void onScanResult(String scanResult);
/**
* 扫描到结果后是否清除 EditText 的文本。
* 如果是一个可见的输入框,用户可以交互,一般情况下不清除,扫描结果会叠加在输入框中;
* 如果是一个不可见的输入框,一般情况下会清除,扫描结果不会叠加,下次相当于扫描新结果。
*
* @return true - 表示清除,false - 不清除。
*/
protected boolean clearTextOnResult() {
return true;
}
}
public interface LineSeparator {
/**
* Classic Mac
*/
String CR = "\r";
/**
* Unix and OS X
*/
String LF = "\n";
/**
* Windows
*/
String CRLF = "\r\n";
}
来源:CSDN
作者:QasimCyrus
链接:https://blog.csdn.net/QasimCyrus/article/details/103831503