另一种全局接收方式已更新:https://blog.csdn.net/qq_39731011/article/details/107684794 (Activity事件全局分发)

扫码盒子通用接收原理

1.本质上是键盘输入事件

2.可以响应EditText的输入事件(前提是获得焦点)

首先写接收源: (假设在MainActivity接收付款码)

接收代码:

public ScanKeyManager scanKeyManager;    private void initView(){        EditText edt = findViewById(R.id.edit_pay_code);        edt.setOnEditorActionListener(new TextView.OnEditorActionListener() {            @Override            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {                String str = v.getText().toString().trim();                Log.e("付款码:", str + "");                if (str.length() == 18) {//134609522362925502                    v.setText("");                    if (scanKeyManager != null)                        scanKeyManager.analysisKeyEvent(str);                }                closeKeyboard();  //事件结束后收回键盘                return true;            }        });    }    private void closeKeyboard(){        if(edt!=null) {            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);            inputMethodManager.hideSoftInputFromWindow(edt.getWindowToken(), 0);        }    }    public void requestEditText(){        if(edt!=null){            edt.setFocusable(true);            edt.setFocusableInTouchMode(true);            edt.requestFocus();        }    }
/* *作者:赵星海 *时间:2020/5/27 16:22 *用途: 扫码盒子接收回调 */ public class ScanKeyManager {    public OnScanValueListener mListener;    public interface OnScanValueListener {        void onScanValue(String value);    }    public ScanKeyManager(OnScanValueListener listener) {        this.mListener = listener;    }    public void analysisKeyEvent(String str) {        mListener.onScanValue(str+"");    }    }

当你要开启扫码接收的时候:(假设在PopupWindow中获得付款码)

            ((MainActivity) mContext).requestEditText();            Toast.makeText(mContext, "请出示付款码", Toast.LENGTH_SHORT).show();            // 语音提醒            SpeechUtils.getInstance(mContext).speakText("请出示付款码");            ((MainActivity) mContext).scanKeyManager = new ScanKeyManager(new ScanKeyManager.OnScanValueListener() {                    @Override                    public void onScanValue(String value) {                        // Log.e("扫码结果:",""+value);                        // Toast.makeText(mContext,"结果"+value,Toast.LENGTH_SHORT).show();                        if (value == null) return;                        if (value.trim().substring(0, 2).equals("28")) {                            goPay(2, value);//1微信 2支付宝                         } else {                            goPay(1, value);                        }                    }            });

 

付款完成后,需要关闭接收。

((MainActivity) mContext).scanKeyManager = null;

完事,就是这么简单,需要额外注意一点:

如果是在PopupWindow中开启回调的话,由于PopupWindow盖在Activity之上,抢了Activity上EditText的焦点。

所以需要在配置PopupWindow时,要将这个配置改成false:this.setFocusable(false); 

或者注释掉这行代码,因为它默认是false。

    /**     * 设置窗口的相关属性     */    @SuppressLint("InlinedApi")    private void setPopupWindow() {        this.setContentView(mPopView);// 设置View        this.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);// 设置弹出窗口的宽        this.setHeight(LinearLayout.LayoutParams.MATCH_PARENT);// 设置弹出窗口的高        // this.setFocusable(true);// 设置弹出窗口可获得焦点    }
 

更多相关文章

  1. 利用HTML5开发Android笔记
  2. 最牛逼android上的图表库MpChart(三) 条形图
  3. android为文本框设置背景资源-shape
  4. Android中常见Intent习惯用法-上篇(附源码下载)
  5. init进程【4】——属性服务
  6. Android(安卓)manifest之系统自带的permission
  7. Android(安卓)Studio(五):修改Android(安卓)Studio项目包名
  8. Android(安卓)各种基础控件布局
  9. Android中ProgressDialog的简单使用.

随机推荐

  1. Android普通对话框原理
  2. AIDL --- Android中的远程接口[转]
  3. checkbox 文字与多选框的对齐问题
  4. Android 自动化测试框架Instrumentation
  5. android 通知提醒
  6. Android(安卓)必须知道2018年流行的框架
  7. 打开Android Studio报错,Unable to create
  8. android 读取DDMS里的文件时打不开,解决方
  9. 修改ProgressBar的进度条颜色
  10. android 禁止横屏时输入法全屏