android - android Oreo 和 onclick 的奇怪行为
问题描述
我有一个使用手持条形码扫描仪的应用程序。我在 android 5.1 中测试了该应用程序并且运行良好,但在 Android Oreo 中,onClick 方法有一个奇怪的行为。
- 应用程序启动,我开始扫描产品。(调用方法 dispatchKeyEvent 以获取条形码)。
- 我触摸屏幕
- 我继续扫描并执行我的活动的 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() 每次发生事件时都会重置计时器。
触摸后,这两种方法都会被调用。我认为这与条形码扫描仪有关。
解决方案
OnClick 事件不仅仅是通过按下按钮触发的。它只需要在按下回车键时获得焦点。为了防止您看到的行为,您需要将按钮上的侦听器更改为 OnTouch(来自 View.OnTouchListener),只有在您物理按下按钮时才会触发。android 版本的可访问性差异可能会导致您看到的行为,因为布局上的第一个按钮自动获得焦点。甚至可能是键盘的差异。
推荐阅读
- jq - jq:如何将复杂的 json 对象与数组合并
- html - 拉取文本,具有唯一的前置文本,但没有来自网页的唯一类或标签
- php - WordPress 数据库错误:[列“日期”不能为空]
- sql-server - TSQL 查询 - 基于条件的新列
- python - 创建一个 python 脚本,将 ping 的结果打印到旋转日志中
- apache-spark - Spark-谓词没有被下推
- css - 如何使用 CSS 网格创建两列网格?
- typescript - 使用不同的头部和休息类型键入数组
- java - Selenium TestNG 中的变量错误
- c# - MSMQ 使用本地用户进行身份验证