android - 是否可以覆盖我的 android 应用程序中所有 View 的 onClick 监听器?

标签 android android-view

activity A 上,我有一个名为 btnA 的按钮,只要单击它就会显示一个 activity B

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

我知道这个问题的解决方案是使用 RxBinding 或 Kotlin 协程去抖动 btnA 的点击监听器...

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

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

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

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

最佳答案

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

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

然后,更改您的 View 以改用它,如下所示:

button.onClickThrottled {
   //TODO - do something
}

关于android - 是否可以覆盖我的 android 应用程序中所有 View 的 onClick 监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56052385/

相关文章:

android - CardView:图像的角在 Android 4.3 中不是圆角的?

java - 将一组垫传递给 native 代码

java - Recyclerview旋转显示时丢失数据,按下按钮时加载数据Android

android - 获取运行时权限错误 E/Minikin : addFont failed to create font/system/fonts/NanumGothic. ttf

android - cwac-loaderex 和 Proguard

android - InputMethodService 与 Jetpack Compose - ComposeView 导致 : Composed into the View which doesn't propagate ViewTreeLifecycleOwner

android - 跟踪移动 View 的速度

android - 调用 BroadcastReceiver 时应用程序崩溃

android - Android 中的 onTouchListener 将检测所有父 View 上的触摸

android - 如何在布局中添加自定义 View ?