删除一个onclick监听器

问题描述 投票:169回答:8

我有一个对象,其中文本周期和显示状态信息。当消息改变,我希望对象的Click事件来改变带你到该消息有关的活动。

所以,我有一个TextView mTitleView和我指定这样的事件。

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

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

android onclick textview listener
8个回答
393
投票

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

更好的设计可能是做在OnClickListener状态的检查,然后确定点击是否不应该做的事情VS添加和结算点击听众。


126
投票

注意,如果一个视图是不可点击(例如一个TextView),设置setOnClickListener(null)将意味着视图是可点击。使用mMyView.setClickable(false)如果你不想让你的看法是点击。例如,如果您使用的XML绘制的背景,这显示了不同国家不同的颜色,如果你的观点仍然可点击,用户可以点击它和不同的背景颜色将显示,这可能看起来很怪异。


11
投票

也许setOnClickListener(null)


8
投票

设置setOnClickListener(null)是一个好主意,在运行时删除点击收听。

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

下面是来自hasOnClickListeners()类采取android.view.View实施

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

感谢上帝。它检查null

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


3
投票

只要把,它很适合我

itemView.setOnClickListener(null);

2
投票

以上答案似乎轻浮,不可靠的。我试图用一个简单的相对布局的ImageView的这样做,并没有禁用onclick事件。

做什么工作对我来说是使用的setEnabled。

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

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

boolean ImageView.isEnabled();

另一种选择是使用setContentDescription(字符串字符串)和字符串getContentDescription()来确定的图的状态。


2
投票
    /**
 * Remove an onclick listener
 *
 * @param view
 * @author [email protected]
 * @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);

© www.soinside.com 2019 - 2024. All rights reserved.