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

Is it possible to override onClick listener of all view in my android application?

activity A 我有一个名为 btnA 的按钮,它将显示 activity B 每次点击.

但是如果我点击这个 btnA 按钮的速度太快,比如一秒钟内点击 2 次,那么 2 activity B 将被显示。很明显。

我知道这个问题的解决方案是使用 RxBinding 或 Kotlin 协程消除 btnA 的点击侦听器...

但是,如果在我的应用程序中有 100 个视图的行为都与 btnA 一样怎么办。我怎样才能以某种方式覆盖或拦截他们的点击侦听器以在一个地方应用去抖动?

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

此外,我认为创建某种根视图/基础视图,所有应用的视图都将从中扩展可能有点矫枉过正。

目前这可能是不可能的,但不知何故我有一种冲动,那就是某处有解决方案。

您可以拥有将实现 View.OnClickListener 的自定义点击侦听器,此外,您还可以使用 Fragment_ActivityListener 将回调传递给 activity/fragment。 Fragment_ActivityListener 是一个接口,您的 activity/fragment 在去抖或逻辑执行后从 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
        }
    }
}

在你的片段中调用它或 Activity 像这样

 btnNext.setOnClickListener(new CustomClickListener(this));

'this' 如果需要实施 Fragment_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
}