16

我已经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 和可聚焦 - false 但它仍然在监听下面的 wrapper.getButton().setOnClickListener() 并执行操作。请给我建议。抱歉更新延迟。谢谢!

更新:我已经做了下面的热修复来解决这个问题。

// section-2
mButton.setVisibility(View.GONE);
mButton.setClickable(false);
mButton.setFocusable(false);
4

13 回答 13

55

这似乎是设计使然。这是来自View.setOnClickListener方法的文档:

注册在单击此视图时要调用的回调。如果此视图不可点击,则它变为可点击。

于 2013-09-16T10:33:12.247 回答
44

而不是使用setClickable(false)使用setEnabled(false)

于 2013-11-21T05:40:10.037 回答
10

将 setClickable 放在 setOnClickListener 之后

mBtn.setOnClickListener(this);
mBtn.setClickable(false);

如果你把 setClickable(false) 放在 setOnClickListener(this) 之前,它就不起作用。

于 2019-09-27T01:22:23.473 回答
4

而不是使用 setClickable(false) 使用以下

button.setFocusableInTouchMode(false);

我在我的应用程序中遇到了同样的问题,我需要将我的按钮设置为在某些情况下不可点击。这对我有用。希望这可以帮助。

于 2013-09-16T10:39:17.917 回答
3

使用View.setOnClickListener()before View.setClickable(),否则该方法setOnclickLisnter()会将标志设置为 true。

于 2018-01-08T08:40:13.510 回答
1

我不确定你是否还在寻找答案,但出于某种奇怪的原因

mBtn.setClickable(true);

阻止视图被点击并

mBtn.setClickable(false);

使它再次可点击。

于 2019-10-11T17:53:32.883 回答
0

你可以检查 if(!view.isClickable()) return;

于 2017-08-02T08:48:12.423 回答
0

在 xml 上

机器人:启用=“假”

安卓:阿尔法=“0.5”

动态的

yourButtonId.alpha = 0.5f

yourButtonId.isEnabled = false

于 2021-07-01T13:19:59.887 回答
0

就像其他朋友说的,setOnClickListener 会将标志覆盖为true。因此,解决方法是在您想要禁用点击时设置
OnTouchEvent ,并在您想要启用点击事件时将其设置为。这是因为在您为视图定义的每个 clickListener 之前都会调用 onTouchEvent,因此返回 true 将对所有侦听器说:return trueretrun false

“好的,我在这里收到了这个活动,其他人无法收到”。

所以你的解决方案可能是这样的:

@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;
}
于 2019-11-12T14:11:22.113 回答
0

我想在 Spinner 上做,只有这个对我有用:

spinner.setOnTouchListener { v, event ->
                return@setOnTouchListener true
            }
于 2020-12-19T19:24:28.373 回答
0

将点击侦听器设置为 null

someView.setOnClickListener(null)

正如@Jan 所说setOnClickListener自动启用点击监听器。因此,可以设置一个空的点击监听器来禁用未来的点击。将视图设置为空点击侦听器后,对该视图的未来点击没有不利影响。

于 2020-07-22T19:53:48.660 回答
0

我刚刚在 Android 4.1.1 上检查了 setClickable(true) 和 setClickable(false),它现在似乎可以工作了。

于 2021-01-30T10:22:07.440 回答
0

这将适用于 Imageview 以及按钮的情况。

 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)which 将相当于setClickable(false).

我们可以使用setEnabled()as 标记,因为它的状态在调用 click 时不受影响(不像setClickable()其状态更改)。

于 2017-08-13T18:00:45.540 回答