删除onclick侦听器

时间:2011-03-04 14:57:06

标签: android onclick textview listener

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

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

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

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

9 个答案:

答案 0 :(得分:383)

mTitleView.setOnClickListener(null)应该可以解决问题。

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

答案 1 :(得分:121)

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

答案 2 :(得分:11)

也许setOnClickListener(null)

答案 3 :(得分:8)

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

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

以下是从hasOnClickListeners()

中获取的android.view.View的实现
 public boolean hasOnClickListeners() {
        ListenerInfo li = mListenerInfo;
        return (li != null && li.mOnClickListener != null);
    }

感谢上帝。它会检查null

所以一切都很安全。享受: - )

答案 4 :(得分:2)

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

对我有用的是使用setEnabled。

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

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

boolean ImageView.isEnabled();

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

答案 5 :(得分:2)

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

    }
}

答案 6 :(得分:2)

刚才说,它对我有用

itemView.setOnClickListener(null);

答案 7 :(得分:0)

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

mTitleView = findViewById(R.id.mTitleView);

答案 8 :(得分:0)

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

fun View.removeClickListener() {
  setOnClickListener(null)
  isClickable = false
}

然后在呼叫者上进行:

val textView = findViewById(R.id.activity_text)
textView.removeClickListener()