Button.setClickable(false)无效

时间:2013-09-16 10:26:29

标签: android android-listview

我在代码中设置了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);

13 个答案:

答案 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