删除onclick侦听器

Jos*_*osh 184 android onclick listener textview

我有一个对象,文本循环并显示状态消息.当消息发生变化时,我希望更改对象的单击事件以将您带到与消息相关的活动.

所以,我有一个TextView mTitleView,我正在分配这样的事件.

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}
Run Code Online (Sandbox Code Playgroud)

如何删除该点击事件?有些状态消息没有可操作区域,所以我想关闭click事件.我也希望能够循环浏览这些点击事件并妥善处理它们,但我不确定最佳做法.

Rob*_*ond 396

mTitleView.setOnClickListener(null) 应该做的伎俩.

更好的设计可能是检查OnClickListener中的状态,然后确定点击是否应该与添加和清除点击侦听器相比.

  • 我想知道听众是否会导致内存分配?我们需要释放它们吗?这会提高应用程序的性能吗? (15认同)
  • 不.侦听器只是一个对象,当您单击时视图用于调用方法,因此当您将其设置为null时,它会将其销毁. (2认同)
  • 感谢您的回答,介意补充一下为什么您认为在侦听器中检查状态或标志更好。 (2认同)
  • 当您说“更好的设计”时,您是在暗示性能影响还是只是说它有点令人反感? (2认同)

Fre*_*Nat 128

请注意,如果视图不可点击(例如TextView),则设置setOnClickListener(null)将表示视图是可点击的.使用mMyView.setClickable(false),如果你不想让你的看法是点击.例如,如果您使用xml drawable作为背景,它为不同的状态显示不同的颜色,如果您的视图仍然可以点击,用户可以单击它并显示不同的背景颜色,这可能看起来很奇怪.

  • 这就是为什么我写"注意,如果视图是不可点击的(例如TextView)" - ListView是可点击的,所以这对它不起作用. (4认同)
  • view.setOnClickListener(null) 和 view.setClickable(false) 一起是正确的答案,谢谢!!!! (2认同)

Lut*_*her 12

也许setOnClickListener(null)吧?

  • 这不适用于复选框,也可能不适用于其他小部件。 (2认同)

Azi*_*ari 8

设置setOnClickListener(null)是在运行时删除单击侦听器的好主意.

也有人评论说,在调用View.hasOnClickListeners()此之后将返回true,我的朋友.

这是hasOnClickListeners()android.view.View课堂上实施的

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }
Run Code Online (Sandbox Code Playgroud)

感谢上帝.它会检查null.

一切都很安全.请享用 :-)


Evi*_*n1_ 6

您可以添加以下扩展功能:

fun View.removeClickListener() {
  setOnClickListener(null)
  isClickable = false
}
Run Code Online (Sandbox Code Playgroud)

然后对你的来电者你会这样做:

val textView = findViewById(R.id.activity_text)
textView.removeClickListener()
Run Code Online (Sandbox Code Playgroud)


Bra*_*son 5

上面的答案似乎轻浮和不可靠。我尝试在简单的相对布局中使用 ImageView 执行此操作,但它没有禁用 onClick 事件。

对我有用的是使用 setEnabled。

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查是否启用了视图:

boolean ImageView.isEnabled();
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用 setContentDescription(String string) 和 String getContentDescription() 来确定视图的状态。


Sai*_*i N 5

只是说,它对我有用

itemView.setOnClickListener(null);
Run Code Online (Sandbox Code Playgroud)