Answers:
mTitleView.setOnClickListener(null)
应该可以。
更好的设计可能是检查OnClickListener中的状态,然后确定单击是否应该执行某些操作,而不是添加和清除单击侦听器。
a better design
是暗示性能影响时,还是只是说这有点令人反感?
请注意,如果视图不可单击(例如TextView),则设置setOnClickListener(null)
将表示该视图可单击。使用mMyView.setClickable(false)
,如果你不想让你的看法是点击。例如,如果您使用xml可绘制背景作为背景,它在不同状态下显示不同的颜色,如果您的视图仍可单击,则用户可以单击它,并且将显示不同的背景颜色,这看起来可能很奇怪。
设置setOnClickListener(null)
是在运行时删除点击侦听器的好主意。
还有人评论说,View.hasOnClickListeners()
此后打来的电话会返回true
,不,我的朋友。
这是hasOnClickListeners()
从android.view.View
类中获取的实现
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();
另一种选择是使用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();
}
}
}