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

时间:2019-05-09 04:50:59

标签: android android-view

关于活动A ,我有一个名为 btnA 的按钮,只要单击该按钮,就会显示活动B

但是,如果我单击此 btnA 按钮的速度太快,例如在一秒钟内单击2次,则会显示2个活动B 。显然。

我知道解决方案是使用RxBinding或Kotlin协程来解除 btnA 的点击监听器...

但是如果a具有100个视图,它们的行为都与我的应用程序中的 btnA 一样,该怎么办?如何以某种方式覆盖或拦截其单击侦听器以在一个地方应用反跳?

编辑: 我正在使用Kotlin,这意味着我可以添加扩展功能,以在View的Click侦听器上应用反跳逻辑,但是如果click事件处理程序受ButterKnife或其他替代库的约束,则将无法正常工作。这就是为什么我要找到一种方法来覆盖或拦截View的点击侦听器。

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

目前这可能是不可能的,但是我不知为何要在那儿找到解决方案。

2 个答案:

答案 0 :(得分:0)

您可以使用自定义的Click侦听器,该侦听器将实现View.OnClickListener,此外,您还可以使用Fragment_ActivityListener将回调传递给您的活动/片段。 Fragment_ActivityListener是一个接口,您的活动/片段在进行反跳或执行逻辑后会从OnClickListener接收回来。

.table tbody>tr.info {
  background-color: #24e5d2 !important;
}

在您的Fragment或Activity中这样调用

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<table class="table table-bordered">
  <tr>
    <td>Definition</td>
  </tr>
  <tr class="info">
    <td>Lorem Ipsum</td>
  </tr>
</table>

如果需要,“此”实现Fragment_ActivityListener,否则可以将其删除。

答案 1 :(得分:0)

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