android Oreo 和 onclick 的奇怪行为

Weird behavior with android Oreo and onclick

我有一个使用手持条码扫描仪的应用程序。我在 android 5.1 中测试了该应用程序并且运行良好,但是在 Android Oreo 中 onClick 方法有一个奇怪的行为。

  1. 应用程序启动,我开始扫描产品。 (调用dispatchKeyEvent方法获取条码)
  2. 我触摸屏幕
  3. 我继续扫描并执行 activity 的 dispatchKeyEvent 和片段中的 onClick 方法。

我不明白为什么。

在我的 MainActivity 中,我收到所有扫描的条形码并发送到我的片段:

@Override
    public boolean dispatchKeyEvent(KeyEvent e)
    {

        getUpcScanned(e);
        upcScannedAlreadyFinished(e);

        return super.dispatchKeyEvent(e);
    }

 public void getUpcScanned(KeyEvent event)
    {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            char pressedKey = (char)event.getUnicodeChar();
            upcScanned += pressedKey;
        }
    }

 private void upcScannedAlreadyFinished(KeyEvent e)
    {
        if(e.getAction() == KeyEvent.ACTION_DOWN && e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
            SelfScanGlobalContext.getInstance().setScrollNeedsToMove(false);
            fragmentHopper.showShoppingCartFragment(upcScanned.trim(), presenterForFragment);
            upcScanned="";
            if(this.presenterForFragment!=null){
                this.presenterForFragment.onUserInteraction();
            }
        }
    }

在我的片段中

  @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        System.out.println("On activity created......");
        super.onActivityCreated(savedInstanceState);
        Button cancelPurchaseBtn = getActivity().findViewById(R.id.cancelPurchaseBtnTest);
        cancelPurchaseBtn.setOnClickListener(this);
    }


 @Override
    public void onClick(View view)
    {
        switch(view.getId()) {
            case R.id.cancelPurchaseBtnTest :
                AlertDialogHopper.createCancelTransactionDialog(this);
                break;
        }
    }

我只有一个 onUserInteraction(),它会在每次事件发生时重置计时器。

触摸后,两种方法都会被调用。我认为这与条码扫描器有关。

作为答案,因为我没有代表发表评论。

您的问题可能与名为 'Scan Wedge' 的东西有关,它实质上将扫描仪用作键盘,并会自动将数据输入到聚焦字段(即 android 中的 editText)。它实际上并不调用您的代码,它是内置在 SDK 中的东西,API 由这些条形码扫描器公司提供,通常您可以通过编程将其关闭。

我唯一的其他建议是使用 println() 或 onClick 方法中的某些内容,或任何其他方法来查看调用的内容、时间和地点

OnClick 事件不仅仅是通过按下您的按钮触发的。它只需要在按下回车键时获得焦点。为了防止您看到的行为,您需要将按钮上的侦听器更改为 OnTouch(来自 View.OnTouchListener),只有当您实际按下按钮时才会触发。 android 版本中的辅助功能差异可能会导致您看到的行为,因为布局上的第一个按钮自动具有焦点。甚至可能是键盘的不同。