【问题标题】:Is it possible to override onClick listener of all view in my android application?是否可以覆盖我的 android 应用程序中所有视图的 onClick 侦听器?
【发布时间】:2019-05-09 04:50:58
【问题描述】:

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

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

我知道解决方案是使用 RxBinding 或 Kotlin 协程对 btnA 的点击监听器进行去抖动...

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

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

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

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

【问题讨论】:

  • 您可以创建一个方法,该方法将具有视图或按钮的 onClickListener。并使用视图/按钮传递该方法。这样,您将拥有一个方法,并且可以在您的所有应用程序中使用它。但是当每个按钮都有不同的工作机制时,就会出现问题。 :)
  • @Umair - 如果我使用某种事件处理程序绑定库(如 ButterKnife),您的解决方案可能不起作用。
  • @Amit - 谢谢,但在活动中实现点击不是我想要的。假设我希望我的应用程序中的所有视图在点击时自行去抖动 1 秒。
  • @HauLuu 您可以创建自定义单击侦听器类,该类将实现 View.OnClickListener,您可以将逻辑放入其中并为所有视图设置此侦听器。然后您将在此调用中收到回调,该调用将独立于活动/片段。

标签: android android-view


【解决方案1】:

我不知道有什么方法可以全局覆盖所有点击监听器。很可能,这是不可能的。但是如果你使用 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
}

【讨论】:

  • 是的!这是我最初的解决方案(不完全是在代码中,但确实有相同的想法)但问题是如果我使用 ButterKnife 将点击事件处理程序绑定到视图,这将不起作用。这就是为什么我找到一种方法来覆盖视图点击事件本身
  • 直接使用 "Handler().postDelayed(...)" 和 "postDelayed(...)" 的区别。在这些情况下都没有 Merory 泄漏?
【解决方案2】:

您可以拥有将实现 View.OnClickListener 的自定义点击侦听器,此外,您可以使用 Fragment_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
        }
    }
}

像这样在 yourFragment 或 Activity 中调用它

 btnNext.setOnClickListener(new CustomClickListener(this));

如果需要,'this' 实现 Fragment_ActivityListener 否则你可以删除它。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多