首页 > 解决方案 > android Oreo 和 onclick 的奇怪行为

问题描述

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

  1. 应用程序启动,我开始扫描产品。(调用方法 dispatchKeyEvent 以获取条形码)。
  2. 我触摸屏幕
  3. 我继续扫描并执行我的活动的 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() 每次发生事件时都会重置计时器。

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

标签: androidandroid-8.0-oreo

解决方案


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


推荐阅读