【问题标题】:Button.setClickable(false) is not workingButton.setClickable(false) 不起作用
【发布时间】:2013-09-20 11:15:18
【问题描述】:

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

【问题讨论】:

  • 这是你的全部代码吗? mButtonwrapper.getButton() 一样吗?如果是这样,为什么不将带有setOnClickListener 的部分放在第 1 节中?

标签: java android android-layout android-listview android-view


【解决方案1】:

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

注册一个回调,以便在单击此视图时调用。如果此视图不可点击,则变为可点击。

【讨论】:

  • srsly..."如果此视图不可点击,则它变为可点击。"在我看来是一个巨大的设计缺陷。感谢您的回答,这应该被接受。
  • 我同意@JacksOnF1re。 Android 是一项非常匆忙的工作,其中包含一些最愚蠢的设计决策。与按钮 setAlpha(0); 相同 - 即使 alpha 为 0,该按钮仍然可以点击。在他们理智的头脑中,谁会让按钮不可见,但仍然可以点击,在什么情况下希望在他们的应用程序中使用它?一些带有隐形按钮的愚蠢猜谜游戏?猜猜我在哪儿! 翻白眼
【解决方案2】:

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

【讨论】:

  • @ADT 我已经编辑了答案。请尝试让我知道结果:)
  • @jozze 同时使用 setClickable 和 setEnabled 对我有用
  • 使用setEnable(false)如果有view的背景,它就会消失
【解决方案3】:

将 setClickable 放在 setOnClickListener 之后

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

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

【讨论】:

  • 这看起来不错的答案,但我想知道为什么它仍然没有被赞成
  • @Jeyaseelan 因为在这个答案之前 6 年已经给出了相同的答案。 stackoverflow.com/a/18825890/1080954
【解决方案4】:

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

button.setFocusableInTouchMode(false);

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      mBtn.setClickable(true);
      

      阻止视图被点击并

      mBtn.setClickable(false);
      

      让它再次可点击。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          这适用于 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),这将等效于setClickable(false)

          我们可以使用setEnabled() 作为标签,因为它的状态在点击调用时不会受到影响(不像setClickable() 的状态会发生变化)。

          【讨论】:

            【解决方案9】:

            就像其他朋友说的,setOnClickListener 会将该标志覆盖为true。
            所以解决方法是在您想要禁用点击时设置OnTouchEvent 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;
            }
            

            【讨论】:

              【解决方案10】:

              设置点击监听为空

              someView.setOnClickListener(null)

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

              【讨论】:

                【解决方案11】:

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

                spinner.setOnTouchListener { v, event ->
                                return@setOnTouchListener true
                            }
                

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    【解决方案13】:

                    在 xml 上

                    android:enabled="false"

                    android:alpha="0.5"

                    动态

                    yourButtonId.alpha = 0.5f

                    yourButtonId.isEnabled = false

                    【讨论】:

                      猜你喜欢
                      • 2017-01-02
                      • 2021-12-30
                      • 1970-01-01
                      • 2018-04-16
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-11-30
                      • 2020-04-28
                      相关资源
                      最近更新 更多