android Oreo 和 onclick 的奇怪行为
Weird behavior with android Oreo and onclick
我有一个使用手持条码扫描仪的应用程序。我在 android 5.1 中测试了该应用程序并且运行良好,但是在 Android Oreo 中 onClick 方法有一个奇怪的行为。
- 应用程序启动,我开始扫描产品。 (调用dispatchKeyEvent方法获取条码)
- 我触摸屏幕
- 我继续扫描并执行 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 版本中的辅助功能差异可能会导致您看到的行为,因为布局上的第一个按钮自动具有焦点。甚至可能是键盘的不同。
我有一个使用手持条码扫描仪的应用程序。我在 android 5.1 中测试了该应用程序并且运行良好,但是在 Android Oreo 中 onClick 方法有一个奇怪的行为。
- 应用程序启动,我开始扫描产品。 (调用dispatchKeyEvent方法获取条码)
- 我触摸屏幕
- 我继续扫描并执行 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 版本中的辅助功能差异可能会导致您看到的行为,因为布局上的第一个按钮自动具有焦点。甚至可能是键盘的不同。