Android 扫码枪以及焦点的处理


这次写的业务中正好包括了扫码枪的内容,借这个机会记录一下扫码枪要怎么处理,还有焦点问题。

首先扫码枪其实是直接录入Edittext的,并且是一个一个字母/数字录入的。那么我们首先要有一个能够录入内容的Edittext:

代码

  1. <EditText
  2. android:id="@+id/et_scanCodeInput"
  3. android:layout_width="1dp"
  4. android:layout_height="1dp"
  5. android:focusable="true"
  6. android:focusableInTouchMode="true" />

宽高要设置为1dp,如果为0实测会有问题,不确定是不是因为框直接没了就无法录入了。

然后在onResumeetScanCodeInput.requestFocus(),让我们的输入框获取到焦点。

一.干掉输入法

在init的时候发现,如果Edittext设置了焦点,输入框就必然会弹出来,这样的体验实在不佳,必须要干掉。

这时我们就要用到setShowSoftInputOnFocus ,  但是这个方法是隐藏的,必须要通过反射的方法来调用。

代码

  1. this.getWindow().setSoftInputMode(
  2. WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
  3. try {
  4. Class<EditText> cls = EditText.class;
  5. Method setShowSoftInputOnFocus;
  6. setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus",
  7. boolean.class);
  8. setShowSoftInputOnFocus.setAccessible(true);
  9. setShowSoftInputOnFocus.invoke(etScanCodeInput, false);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
二.获取扫码枪内容

代码

  1. etScanCodeInput.addTextChangedListener(inputTextWatcher);
  2. private final TextWatcher inputTextWatcher = new TextWatcher() {
  3. @Override
  4. public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  5. }
  6. @Override
  7. public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  8. }
  9. @Override
  10. public void afterTextChanged(Editable editable) {
  11. String code = editable.toString();
  12. Log.e("code", code + ",length:" + code.length());
  13. if (code.endsWith("\n") && code.length() > 5) {
  14. String scanCode = "";
  15. scanCode = code.substring(0, code.length() - 1);
  16. Log.e("scanCode", "scanCode:" + scanCode);
  17. for (MenuItem orderItem : menuItemLists) {
  18. if (scanCode.equals(orderItem.SKU)) {
  19. ExtOrderBean extOrderBean = new ExtOrderBean();
  20. extOrderBean.goodsName = orderItem.goodsName;
  21. extOrderBean.goodsRemake = orderItem.goodsRemake;
  22. extOrderBean.goodsPrice = orderItem.goodsPrice;
  23. extOrderBean.goodsWeight = 1;
  24. extOrderBean.goodsAmount = orderItem.goodsAmount;
  25. extOrderBean.goodsPluType = 2;
  26. extOrderBean.gCode = orderItem.gCode;
  27. extOrderBean.pluID = orderItem.pluID;
  28. extOrderBean.displayMode = orderItem.displayMode;
  29. extOrderBean.displayName = orderItem.displayName;
  30. Log.e("MainActivity", "扫到内容:" + orderItem.goodsName);
  31. IscaleSDKManager.getInstance().getSupportUdpManager().addOrderToService(extOrderBean);
  32. }
  33. }
  34. etScanCodeInput.setText("");
  35. }
  36. }
  37. };

根据扫码枪给到的"\n"标志或者固定长度来判断扫码成功,截取获得到的内容。

三.多个Edittext焦点处理

在多个Edittext的时候,当第二个Edittext获取了焦点,会导致我们扫码枪用的Edittext失去焦点,并且无法再次获得,必须要进行一些处理。

首先是在dispatchTouchEvent中移除第二个Edittext的焦点,然后模拟手动点击第一个Edittext。

代码

  1. @Override
  2. public boolean dispatchTouchEvent(MotionEvent ev) {
  3. etCode.clearFocus();
  4. etScanCodeInput.requestFocus();
  5. etScanCodeInput.callOnClick();
  6. return super.dispatchTouchEvent(ev);
  7. }

这样我们只要点击任意空白处就会直接移除第二个Edittext的焦点,并且让我们扫码枪对应的输入框直接获得焦点,让用户无感继续使用扫码枪。