是否可以在我的android应用程序中覆盖所有视图的onClick侦听器?

是否可以在我的android应用程序中覆盖所有视图的onClick侦听器?,android,android-view,Android,Android View,在活动A上,我有一个名为btnA的按钮,每当单击该按钮时,它将显示活动B 但是如果我点击这个btnA按钮的速度太快,比如在一秒钟内点击两次,那么就会显示2个活动B。很明显 我知道解决这个问题的方法是使用RxBinding或Kotlin协同程序对btnA的点击侦听器进行去抖动 但是如果一个应用程序有100个视图,它们的行为就像我的应用程序中的btnA,那该怎么办呢。我如何能够以某种方式覆盖或拦截他们的点击侦听器,以便在一个位置应用去抖动 编辑: 我使用的是Kotlin,这意味着我可以添加一个扩展函

活动A上,我有一个名为btnA的按钮,每当单击该按钮时,它将显示活动B

但是如果我点击这个btnA按钮的速度太快,比如在一秒钟内点击两次,那么就会显示2个活动B。很明显

我知道解决这个问题的方法是使用RxBinding或Kotlin协同程序对btnA的点击侦听器进行去抖动

但是如果一个应用程序有100个视图,它们的行为就像我的应用程序中的btnA,那该怎么办呢。我如何能够以某种方式覆盖或拦截他们的点击侦听器,以便在一个位置应用去抖动

编辑: 我使用的是Kotlin,这意味着我可以添加一个扩展函数,在视图的点击监听器上应用去Bounce逻辑,但如果点击事件处理程序被ButterKnife或其他可选库绑定,那么这将不起作用。这就是为什么我要找到一种方法来覆盖或拦截视图的单击侦听器

此外,我认为,创建某种根视图/基本视图(所有应用程序的视图都将从中扩展)可能会有些过分


目前这可能是不可能的,但不知何故,我强烈要求有一个解决方案。

您可以使用自定义的click listener来实现View.onClick listener,此外,您还可以使用fragment\u ActivityListener将回调传递给您的活动/片段。Fragment_ActivityListener是一个接口,您的活动/片段在执行解块或逻辑后从OnClickListener接收它

 private class CustomClickListener implements View.OnClickListener {
   Fragment_ActivityListener listener;

   CustomClickListener(Fragment_ActivityListener listener){
       this.listener = listener;
   }

    @Override
    public void onClick(View view) {
          //Custom logic for debounce & call activity or fragment listener
        }
    }
}
在你的片段或活动中这样称呼它

 btnNext.setOnClickListener(new CustomClickListener(this));

“this”在需要时实现Fragment\u ActivityListener,否则您可以删除它。

我不知道有什么方法可以全局覆盖所有单击侦听器。很可能,这是不可能的。但是如果你使用Kotlin,你可以这样做:

fun View.onClickThrottled(skipDurationMillis: Long = 750, action: () -> Unit) {
  var isEnabled = true
  this.setOnClickListener {
    if (isEnabled) {
      action()
      isEnabled = false
      Handler().postDelayed({ isEnabled = true }, skipDurationMillis)
    }
  }
}
button.onClickThrottled {
   //TODO - do something
}
然后,将视图更改为使用此选项,如下所示:

fun View.onClickThrottled(skipDurationMillis: Long = 750, action: () -> Unit) {
  var isEnabled = true
  this.setOnClickListener {
    if (isEnabled) {
      action()
      isEnabled = false
      Handler().postDelayed({ isEnabled = true }, skipDurationMillis)
    }
  }
}
button.onClickThrottled {
   //TODO - do something
}

您可以创建一个具有视图或按钮的onClickListener的方法。并使用视图/按钮传递该方法。这样,您将拥有一个方法,并且可以在所有应用程序中使用它。但当每个按钮都有不同的工作机制时,就会出现问题。:)查看此帖子:@Umair-如果我使用ButterKnife之类的事件处理程序绑定库,您的解决方案可能不起作用。@Amit-谢谢,但在单击活动中实现它不是我想要的。假设我希望我的应用程序中的所有视图都能在单击时自动去抖动1秒钟。@HauLuu您可以创建自定义的单击侦听器类,该类将实现view.OnClickListener,您可以将逻辑放在该类中,并为所有视图设置此侦听器。然后,您将在该调用中收到回调,该调用将独立于活动/片段。耶!这是我最初的解决方案(不完全在代码中,但有相同的想法),但问题是如果我使用ButterKnife将click事件处理程序绑定到视图,这将不起作用。这就是为什么我找到了一种覆盖视图点击事件的方法,它本身就是直接使用“Handler().postDelayed(…)”和“postDelayed(…)”之间的区别。在这些案例中没有任何一个存在merory泄漏?