我在代码中设置了mButton.setClickable(false);
,但我的代码的全局button.setOnClickListener
仍调用此按钮。
编辑:抱歉延迟更新。以下是我遇到问题的详细信息 在我的listview中的customAdapter类getView方法
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
YourWrapper wrapper = null;
HashMap<String, Object> cTa= new HashMap<String, Object>();
cTa= d.getPosition(position)
Button mButton = (Button)convertView.findViewById(R.id.mBtn);
if (row == null)
{
row = inflater.inflate(R.layout.layout, parent, false);
wrapper = new YourWrapper (row);
row.setTag(wrapper);
}
else
wrapper = (YourWrapper) row.getTag();
if(success)
{
// section-1
mButton.setClickable(true);
}
else{
// section-2
mButton.setClickable(false);
mButton.setFocusable(false);
}
wrapper.getButton().setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
//operation
}
});
return row;
}
上面是当前正在运行的代码,在第2节它使mButton可单击 - 假,并且可聚焦 - 为false但仍然在监听下面的wrapper.getButton()。setOnClickListener()并执行操作。请建议我。抱歉延迟更新。谢谢!
更新:我已经制作了以下解决问题的热门修复程序。
// section-2
mButton.setVisibility(View.GONE);
mButton.setClickable(false);
mButton.setFocusable(false);
答案 0 :(得分:38)
这似乎是设计上的。这来自View.setOnClickListener 方法的文档:
注册单击此视图时要调用的回调。如果此视图无法点击,则会变为可点击。
答案 1 :(得分:23)
而不是使用setClickable(false)
使用setEnabled(false)
答案 2 :(得分:3)
使用以下
而不是使用setClickable(false)button.setFocusableInTouchMode(false);
我在我的应用程序中遇到了同样的问题,我需要将按钮设置为在某些条件下不可点击。这对我有用。希望这会有所帮助。
答案 3 :(得分:1)
在View.setOnClickListener()
之前使用View.setClickable()
,或方法setOnclickLisnter()
将标志设为true。
答案 4 :(得分:0)
你可以检查if(!view.isClickable())return;
答案 5 :(得分:0)
这适用于Imageview和按钮。
validateEmployee() {
this.employeeService.updateEmployee(this.employee).
subscribe(() => {
let urlOrigin: string = this.sharedService.getUrlOrigin();
this.router.navigate([urlOrigin]);
}),
error => {
this.error = error.message;
};
}
}
在 private OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (imageview.isEnabled()){
//I have wrapped all code inside onClick() in this if condition
//Your onClick() code will only execute if the imageview is enabled
//Now we can use setEnabled() instead of setClickable() everywhere
}}
};
内,您可以执行onCreate()
,这相当于setEnabled(false)
。
我们可以使用setClickable(false)
作为标记,因为它的状态在调用点击时不受影响(与状态更改的setEnabled()
不同。)
答案 6 :(得分:0)
在setOnClickListener之后放置setClickable
mBtn.setOnClickListener(this);
mBtn.setClickable(false);
如果将setClickable(false)放在setOnClickListener(this)之前,它将不起作用。
答案 7 :(得分:0)
我不确定您是否还在寻找答案,但是出于某些奇怪的原因
mBtn.setClickable(true);
阻止视图被单击,并且
mBtn.setClickable(false);
使其再次可点击。
答案 8 :(得分:0)
就像其他朋友所说的那样,setOnClickListener将覆盖该标记为true。
因此,解决方法是在您希望禁用点击时将setOnTouchEvent return true
设置为retrun false
。启用点击事件。
这是因为onTouchEvent在您为视图定义的每个clickListener之前调用,因此返回true将对所有侦听器说:
“好,我在这里收到了此活动,没有其他人可以接收。”
所以您的解决方案可能是这样的:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
YourWrapper wrapper = null;
HashMap<String, Object> cTa= new HashMap<String, Object>();
cTa= d.getPosition(position)
Button mButton = (Button)convertView.findViewById(R.id.mBtn);
if (row == null)
{
row = inflater.inflate(R.layout.layout, parent, false);
wrapper = new YourWrapper (row);
row.setTag(wrapper);
}
else
wrapper = (YourWrapper) row.getTag();
if(success)
{
// section-1
mButton.setOnTouchListener((v, event) -> false);
}
else{
// section-2
mButton.setOnTouchListener((v, event) -> true);
}
wrapper.getButton().setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
//operation
}
});
return row;
}
答案 9 :(得分:0)
someView.setOnClickListener(null)
与 @Jan notes 一样,setOnClickListener
自动启用点击侦听器。因此,可以将空点击侦听器设置为禁用将来的点击。将视图设置为空点击侦听器后,对该视图的将来点击不会产生不利影响。
答案 10 :(得分:0)
我想在 Spinner 上做这件事,只有这个对我有用:
spinner.setOnTouchListener { v, event ->
return@setOnTouchListener true
}
答案 11 :(得分:0)
我刚刚在 Android 4.1.1 上检查了 setClickable(true) 和 setClickable(false),现在似乎可以正常工作了。
答案 12 :(得分:0)
关于 xml
android:enabled="false"
android:alpha="0.5"
动态
yourButtonId.alpha = 0.5f
yourButtonId.isEnabled = false