我正在编写一个非常简单的应用程序,其中包含以下场景:
1)屏幕A 有 3按钮可在其他屏幕上移动。
2)现在如果我按住一个按钮(比如按钮1)并快速点击其他按钮,那么它会启动其他屏幕的多个实例。我认为不应该发生这种情况。如何防止这种情况。
3)它更奇怪。如果我没有在屏幕A 上发布按钮1 ,则在其他屏幕上移动后,仍然允许执行点击以暂停的两个按钮屏幕A 即使我可以看到第二个屏幕。
此处它清晰启动第二个屏幕,但仍然是第一个屏幕按钮事件工作。 任何想法如何避免这种情况。
答案 0 :(得分:0)
我找到的一个解决方案是在 onPause()中禁用点击监听器,并在 onResume()中启用它。我们可以为此提供更好的支持吗?
答案 1 :(得分:0)
如果启用1,您将如何禁用其他按钮,这是一个算法问题。您可以尝试在活动中创建布尔值或控件变量(然后将活动的最终引用传递到您需要的任何位置),或者在静态上下文中。但要回答问题的标题 - 您可以通过添加OnTouchListener
来“取消触摸事件”,或者如果您要扩展类按钮,则可以覆盖onTouchEvent(MotionEvent ev)
方法。
使用OnTouchListener将禁用任何先前定义的触摸事件行为。您可以通过从按钮调用performClick
方法从内部调用实际的点击事件。
//in order to use button inside OnTouchEvent, its reference must be final
//if it's not, create a new final reference to your button, like this:
final finalButton = button;
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouchEvent(MotionEvent ev) {
// ... additional code if necessary
if(canBeClicked) {
finalButton.performClick();
return true;
}
else return false;
}
}
在类扩展Button中覆盖onTouchEvent应该看起来像这样。
@Override
public boolean onTouchEvent(MotionEvent ev) {
// ... additional code if necessary
//here we don't really need to call performClick(), although API recommends it
//we just send the touch event to the super-class and let it handle the situation.
if(activity.canBeClicked) return super.onTouchEvent(ev);
else return false;
}