删除一个onclick监听器
我有一个对象的文本循环和显示状态消息。 当消息发生变化时,我想要更改对象的单击事件以将您带到消息所关联的活动。
所以,我有一个TextView mTitleView
,我分配这样的事件。
public void setOnTitleClickListener(OnClickListener listener) { mTitleView.setOnClickListener(listener); }
如何删除该点击事件? 有一些状态消息没有可操作的区域,所以我想closures点击事件。 我也希望能够循环浏览这些点击事件并妥善处理它们,但我不确定最佳做法。
mTitleView.setOnClickListener(null)
应该做的伎俩。
更好的devise可能是检查OnClickListener中的状态,然后确定点击是否应该执行某些操作,而不是添加和清除点击监听器。
请注意,如果视图不可点击(例如TextView),则设置setOnClickListener(null)
将意味着该视图是可点击的。 如果您不希望视图可点击,请使用mMyView.setClickable(false)
。 例如,如果您使用xml drawable作为背景,为不同的状态显示不同的颜色,如果您的视图仍然是可点击的,用户可以点击它并显示不同的背景颜色,这可能看起来很奇怪。
也许setOnClickListener(null)
?
设置setOnClickListener(null)
是在运行时删除点击侦听器的好主意。
也有人评论说,调用View.hasOnClickListeners()
之后将返回true
, 否我的朋友。
这里是从android.view.View
类中取得的hasOnClickListeners()
的实现
public boolean hasOnClickListeners() { ListenerInfo li = mListenerInfo; return (li != null && li.mOnClickListener != null); }
感谢上帝。 它检查null
。
所以一切都安全。 请享用 :-)
上面的答案看起来不够灵活和不可靠。 我试图用一个简单的相对布局的ImageView,并没有禁用onClick事件。
什么工作对我来说是使用setEnabled。
ImageView v = (ImageView)findViewByID(R.id.layoutV); v.setEnabled(false);
然后您可以检查视图是否启用:
boolean ImageView.isEnabled();
另一种select是使用setContentDescription(String string)和String getContentDescription()来确定视图的状态。
/** * 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(); } } }
只是说,它已经为我工作
itemView.setOnClickListener(null);