删除一个onclick监听器


194

我有一个文本在其中循环并显示状态消息的对象。消息更改时,我希望更改对象的click事件以将您带到消息所关联的活动。

因此,我有一个,TextView mTitleView并且正在分配这样的事件。

public void setOnTitleClickListener(OnClickListener listener) {
    mTitleView.setOnClickListener(listener);
}

如何删除该点击事件?有些状态消息没有可操作的区域,因此我想关闭click事件。我还希望能够遍历这些单击事件并正确处理它们,但是我不确定最佳实践。

Answers:


416

mTitleView.setOnClickListener(null) 应该可以。

更好的设计可能是检查OnClickListener中的状态,然后确定单击是否应该执行某些操作,而不是添加和清除单击侦听器。


1
我没有其他清除操作可以注销该事件吗?
乔什

2
不。侦听器只是视图单击时用来调用方法的对象,因此将其设置为null时,它会销毁它。
罗比·庞德

15
我想知道听众是否会导致内存分配?我们需要释放它们吗?这会提高应用程序的性能吗?
alicanbatur

1
感谢您的回答,请注意,为什么您认为在侦听器中检查状态或标记更好呢?
kapv89

2
当您说a better design是暗示性能影响时,还是只是说这有点令人反感?
RTF

132

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


这对于TextView之类的东西是很好的,但是对于ListView,它在先前设置OnClickListener时没有作用。
某处某人

4
这就是为什么我写了“请注意,如果视图不可单击(例如,一个TextView)”-ListView是可单击的,因此不适用于它。
FreewheelN13年

我认为,如果我们需要来回切换以禁用/启用View的onClickListener,那是比设置setOnClickListener(null)更好的解决方案。
2014年

1
view.setOnClickListener(null)与view.setClickable(false)一起是正确的答案,谢谢!!!
Petros Mastrantonas 2015年


8

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

还有人评论说,View.hasOnClickListeners()此后打来的电话会返回true不,我的朋友。

这是hasOnClickListeners()android.view.View类中获取的实现

 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

感谢上帝。它检查null

所以一切都是安全的。请享用 :-)


4

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

对我有用的是使用setEnabled。

ImageView v = (ImageView)findViewByID(R.id.layoutV);
v.setEnabled(false);

然后,您可以检查是否通过以下方式启用了视图:

boolean ImageView.isEnabled();

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



3
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author malin.myemail@gmail.com
 * @website https://github.com/androidmalin
 * @data 2016-05-16
 */
public static void unBingListener(View view) {
    if (view != null) {
        try {
            if (view.hasOnClickListeners()) {
                view.setOnClickListener(null);

            }

            if (view.getOnFocusChangeListener() != null) {
                view.setOnFocusChangeListener(null);

            }

            if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
                ViewGroup viewGroup = (ViewGroup) view;
                int viewGroupChildCount = viewGroup.getChildCount();
                for (int i = 0; i < viewGroupChildCount; i++) {
                    unBingListener(viewGroup.getChildAt(i));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

0

只需重新初始化以下项即可解决问题。它将根据项目删除onclick,onlonglick,onitemclick,onitemlongclick

mTitleView = findViewById(R.id.mTitleView);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.