这次写的业务中正好包括了扫码枪的内容,借这个机会记录一下扫码枪要怎么处理,还有焦点问题。
首先扫码枪其实是直接录入Edittext的,并且是一个一个字母/数字录入的。那么我们首先要有一个能够录入内容的Edittext:
<EditText android:id="@+id/et_scanCodeInput" android:layout_width="1dp" android:layout_height="1dp" android:focusable="true" android:focusableInTouchMode="true" />
宽高要设置为1dp,如果为0实测会有问题,不确定是不是因为框直接没了就无法录入了。
然后在onResume中etScanCodeInput.requestFocus(),让我们的输入框获取到焦点。
一.干掉输入法
在init的时候发现,如果Edittext设置了焦点,输入框就必然会弹出来,这样的体验实在不佳,必须要干掉。
这时我们就要用到setShowSoftInputOnFocus , 但是这个方法是隐藏的,必须要通过反射的方法来调用。
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
try {
Class<EditText> cls = EditText.class;
Method setShowSoftInputOnFocus;
setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus",
boolean.class);
setShowSoftInputOnFocus.setAccessible(true);
setShowSoftInputOnFocus.invoke(etScanCodeInput, false);
} catch (Exception e) {
e.printStackTrace();
}
二.获取扫码枪内容
etScanCodeInput.addTextChangedListener(inputTextWatcher); private final TextWatcher inputTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void afterTextChanged(Editable editable) { String code = editable.toString(); Log.e("code", code + ",length:" + code.length()); if (code.endsWith("\n") && code.length() > 5) { String scanCode = ""; scanCode = code.substring(0, code.length() - 1); Log.e("scanCode", "scanCode:" + scanCode); for (MenuItem orderItem : menuItemLists) { if (scanCode.equals(orderItem.SKU)) { ExtOrderBean extOrderBean = new ExtOrderBean(); extOrderBean.goodsName = orderItem.goodsName; extOrderBean.goodsRemake = orderItem.goodsRemake; extOrderBean.goodsPrice = orderItem.goodsPrice; extOrderBean.goodsWeight = 1; extOrderBean.goodsAmount = orderItem.goodsAmount; extOrderBean.goodsPluType = 2; extOrderBean.gCode = orderItem.gCode; extOrderBean.pluID = orderItem.pluID; extOrderBean.displayMode = orderItem.displayMode; extOrderBean.displayName = orderItem.displayName; Log.e("MainActivity", "扫到内容:" + orderItem.goodsName); IscaleSDKManager.getInstance().getSupportUdpManager().addOrderToService(extOrderBean); } } etScanCodeInput.setText(""); } } };
根据扫码枪给到的"\n"标志或者固定长度来判断扫码成功,截取获得到的内容。
三.多个Edittext焦点处理
在多个Edittext的时候,当第二个Edittext获取了焦点,会导致我们扫码枪用的Edittext失去焦点,并且无法再次获得,必须要进行一些处理。
首先是在dispatchTouchEvent中移除第二个Edittext的焦点,然后模拟手动点击第一个Edittext。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { etCode.clearFocus(); etScanCodeInput.requestFocus(); etScanCodeInput.callOnClick(); return super.dispatchTouchEvent(ev); }
这样我们只要点击任意空白处就会直接移除第二个Edittext的焦点,并且让我们扫码枪对应的输入框直接获得焦点,让用户无感继续使用扫码枪。