0

我正在为一个主要使用集成了霍尼韦尔扫描仪的 NOMU T20 设备的客户端开发一个 Android 应用程序。

我正在使用虚拟键盘将 TextWatcher 添加到 EditText 以显示扫描的条形码并触发对 API 端点的调用(使用和结束字符“\n”)。如果我不导航到另一个活动或片段,它工作正常。

问题是一旦我完成当前活动(又名“Act1”)并使用另一个带有自己的 TextWatcher 的 EditText 导航到另一个(又名“Act2”)并再次扫描它会触发两个 TextWatcher,第一个来自“Act1”,最后一个来自“Act2”。这意味着当我只想为 Act2(当前活动)调用第二个 API 端点时,我对第一个 API 端点有一个额外的调用。

这个问题也可以用片段来重现。

我尝试使用这个使用广播接收器的库 - > https://github.com/hjgode/IntentAPISample_by_HW没有成功,我没有得到任何数据。

重现问题的代码(仅使用集成扫描仪而非外部扫描仪)

在活动的 EditText 上添加一个 TextChangedListener:

edit.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {

            if (s.toString().trim().length() == 0)
                return;

            if (s.length() > 0) {

                char lastCharacter = s.charAt(s.length() - 1);

                if (lastCharacter == '\n' || lastCharacter == '\r') {
                    String barcode = s.subSequence(0, s.length() - 1).toString();
                    edit.setText("");                       
                    Toast.makeText(MainActivity.this, barcode, Toast.LENGTH_LONG).show();
                    Log.e("MainActivity", barcode);
                }
            }
        }
    });

在扫描时的 Act2 上,我在终端中得到了这个日志。我试图找出“I/song”和“I/song-view”消息。

    I/song: hava scan message androidx.appcompat.widget.AppCompatEditText{9895392 VFED..CL. .F....ID 206,467-515,558 #7f080097 app:id/edit_barcode}
I/song-view: hava scan message 0
E/MainActivity: HORAE
I/song: hava scan message androidx.appcompat.widget.AppCompatEditText{fc384f3 VFED..CL. .F...... 206,467-515,558 #7f080098 app:id/edit_barcode2}
I/song-view: hava scan message 0
E/Act2: HORAE
D/WindowClient: Add to mViews: android.widget.LinearLayout{9fd1546 V.E...... ......I. 0,0-0,0}, this = android.view.WindowManagerGlobal@ff7017e
D/ViewRootImpl[Toast]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
D/Surface: Surface::connect(this=0x8d7d9000,api=1)
D/Surface: Surface::allocateBuffers(this=0x8d7d9000)
D/WindowClient: Add to mViews: android.widget.LinearLayout{1653fd2 V.E...... ......I. 0,0-0,0}, this = android.view.WindowManagerGlobal@ff7017e
D/ViewRootImpl[Toast]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
D/Surface: Surface::allocateBuffers(this=0x8bf1c000)
D/Surface: Surface::connect(this=0x8bf1c000,api=1)

如果有人知道解决此问题的任何方法,我将不胜感激 在此先感谢

4

1 回答 1

0

我通过删除“onStop/onDestroy”生命周期方法上的 TextWatcher 解决了这个问题。

第 1 步:实现我自己的 TextWatcher -> MyTextWatcher

第 2 步:在两个活动上实例化MyTextWatcher并将其附加到 EditText

addTextChangedListener(mTextWatcherObj)

第 3 步:移除监​​听器

removeTextChangedListener(mTextWatcherObj);

谢谢

于 2021-04-22T10:09:33.210 回答