我有一个文本循环并显示状态消息的对象。当消息发生变化时,我希望更改对象的click事件,以转到与消息相关的活动。
所以,我有一个TextView mTitleView
,我正在分配这样的事件。
public void setOnTitleClickListener(OnClickListener listener) {
mTitleView.setOnClickListener(listener);
}
如何删除该点击事件?有些状态消息没有可操作区域,所以我想关闭click事件。我也希望能够循环浏览这些点击事件并妥善处理它们,但我不确定最佳做法。
答案 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()