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

我有一个TextView mTitleView我像这样分配事件。

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

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


当前回答

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

还有人评论说,在此之后调用View.hasOnClickListeners()将返回true, NO my friend。

下面是来自android.view.View类的hasOnClickListeners()的实现

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

感谢上帝。它检查是否为空。

所以一切都很安全。喜欢:-)

其他回答

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

还有人评论说,在此之后调用View.hasOnClickListeners()将返回true, NO my friend。

下面是来自android.view.View类的hasOnClickListeners()的实现

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

感谢上帝。它检查是否为空。

所以一切都很安全。喜欢:-)

简单地说,它对我很有效

itemView.setOnClickListener(null);

注意,如果一个视图是不可点击的(例如TextView),设置setOnClickListener(null)将意味着该视图是可点击的。使用mMyView.setClickable(false)如果你不希望你的视图是可点击的。例如,如果你使用xml绘制背景,它显示不同的颜色为不同的状态,如果你的视图仍然是可点击的,用户可以点击它,不同的背景颜色将显示,这可能看起来很奇怪。

只需像下面那样重新初始化item即可。它会根据项目删除onclick,onlonglick,onitemclick,onitemlongclick

mTitleView = findViewById(R.id.mTitleView);

    /**
 * 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();
        }

    }
}