【问题标题】:How to disable an Android button?如何禁用Android按钮?
【发布时间】:2011-05-22 01:22:27
【问题描述】:

我创建了一个布局,其中包含两个按钮,下一个和上一个。在按钮之间,我生成了一些动态视图。因此,当我第一次启动应用程序时,我想禁用“上一个”按钮,因为不会有任何以前的视图。当没有更多视图可显示时,我还想禁用“下一步”按钮。有没有禁用按钮?

【问题讨论】:

    标签: android android-button


    【解决方案1】:

    你试过了吗?

    myButton.setEnabled(false); 
    

    更新:感谢格温。差点忘了android:clickable可以在你的XML布局中设置来判断一个按钮是否可以点击。

    【讨论】:

    • 相当于android:enabled in xml。
    • 您在文档中哪里找到的?可以在这里链接吗?
    • @Namratha 它仅适用于“按钮”小部件,不适用于 imageView 作为按钮
    • Xamarin 等效项:myButton.Enabled = false;
    【解决方案2】:

    您无法在 XML 中启用或禁用它(因为您的布局是在运行时设置的),但您可以使用android:clickable 设置它是否可以在活动启动时点击。

    【讨论】:

    • 5 年的 Android 经验,我现在就知道了! ://
    【解决方案3】:

    是的,它可以在 XML 中禁用 只是使用:

    <Button
    android:enabled="false"
    />
    

    【讨论】:

    • 这是 xml 的真正答案。所有那些搞乱可点击的废话都与如何绘制按钮以使其看起来被禁用无关。
    • 我认为人们认为您不能这样做,因为当您开始键入时,AS/IDEA 代码完成不建议android:enabled。 (直到今天。)
    • 我试过不行,只有代码setEnabled是工作
    【解决方案4】:

    您只需在活动中编写一行代码

    Button btn = (Button) findViewById(R.id.button1);
    btn.setEnabled(false);
    

    当你想启用同一个按钮时,只需编写

    Button btn = (Button) findViewById(R.id.button1);
    btn.setEnabled(true);
    

    【讨论】:

    • 2行。这是一。 ((Button)findViewById(R.id.mybutton)).setEnabled(false);
    • 试着理解马特的感受.. ;)
    【解决方案5】:

    在 Java 中,一旦你有了按钮的引用:

    Button button = (Button) findviewById(R.id.button);
    

    要启用/禁用按钮,您可以使用:

    button.setEnabled(false);
    button.setEnabled(true);
    

    或者:

    button.setClickable(false);
    button.setClickable(true);
    

    既然要从一开始就禁用按钮,可以在onCreate方法中使用button.setEnabled(false);。 否则,从 XML 中,您可以直接使用:

    android:clickable = "false"
    

    所以:

    <Button
            android:id="@+id/button"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/button_text"
            android:clickable = "false" />
    

    【讨论】:

    • 2010 年 12 月 8 日 7:08 Varun 回答
    • @Poldie:实际上,如果您阅读了这两个答案,您就会明白它们非常相似但并不相等。
    【解决方案6】:

    就我而言,

    myButton.setEnabled(false);
    myButton.setEnabled(true);
    

    工作正常,它正在按应有的方式启用和禁用按钮。但是一旦按钮状态变为禁用状态,它就再也不会回到启用状态,尽管它是可点击的。我尝试使可绘制状态无效并刷新,但没有运气。

    myButton.invalidate();
    myButton.refreshDrawableState();
    

    如果您或任何人遇到类似问题,对我有用的是再次设置背景可绘制对象。适用于任何 API 级别。

    myButton.setEnabled(true);
    myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
    

    【讨论】:

      【解决方案7】:

      在 Kotlin 中,如果您使用 id 引用按钮视图,则启用/禁用按钮

      layout.xml

      <Button
         android:id="@+id/btn_start"
         android:layout_width="100dp"
         android:layout_height="50dp"
         android:text="@string/start"
         android:layout_alignParentBottom="true"/>
      

      activity.kt

        btn_start.isEnabled = true   //to enable button
        btn_start.isEnabled = false  //to disable button
      

      【讨论】:

        【解决方案8】:

        使用 Kotlin,您可以做到,

        // to disable clicks
        myButton.isClickable = false 
        
        // to disable button
        myButton.isEnabled = false
        
        // to enable clicks
        myButton.isClickable = true 
        
        // to enable button
        myButton.isEnabled = true
        

        【讨论】:

        • // 启用按钮 myButton.isEnabled = false
        【解决方案9】:

        错误的方式在侦听器中使用变量而不是参数!!!

        btnSend.setOnClickListener(new OnClickListener() {
        
            @Override
            public void onClick(View v) {
                btnSend.setClickable(false);
        
            }
        });
        

        正确的方式:

        btnSend.setOnClickListener(new OnClickListener() {
        
            @Override
            public void onClick(View v) {
        
                /** check given view  by assertion or cast as u wish */
                if(v instance of Button) {
        
                    /** cast */
                    Button button = (Button) v;
        
                    /** we can perform some check up */
                    if(button.getId() == EXPECTED_ID) {
        
                        /** disable view */
                        button.setEnabled(false)            
                        button.setClickable(false); 
                    }
        
                } else {
        
                     /** you can for example find desired view by root view  */
                     Button bt = (Button) v.getRootView().findViewById(R.id.btId);
        
                     /*check for button */
                     if(bt!=null) {
        
                         /** disable button view */
                         ...
                     } else {
                         /** according to @jeroen-bollen remark
                           * we made assumption that we expected a view
                           * of type button here in other any case  
                           */
                          throw new IllegalArgumentException("Wrong argument: " +
                                 "View passed to method is not a Button type!");
                     }
                  }
               }
            });
        

        编辑: 回复@jeroen-bollen

         View.OnClickListener 
        

        接口定义,用于在单击视图时调用回调。

        带有方法定义

        void onClick(View v);
        

        当点击视图时,View 类对象会回调方法 onClick() 作为参数本身发送,因此如果它这样做,则不应出现空视图参数,这是一个 断言错误,它可能会发生例如当 View 对象类同时被销毁(例如被 GC 收集)或方法因 hack 被篡改时

        关于instanceof & null

        JLS / 15.20.2。类型比较运算符 instanceof

        在运行时,instanceof 运算符的结果为真 如果 RelationalExpression 的值不为空 并且可以将引用转换为 ReferenceType 不引发 ClassCastException。

        否则结果为假


        作者三句话

        如果你问为什么?

        主要是为了避免 NullPointerException

        更多的代码将节省您在以后的代码中跟踪错误的时间,并减少异常的发生。

        考虑以下示例:

        View.OnClickListener listener = new OnClickListener() {
        
            @Override
            public void onClick(View v) {
                btnSend.setClickable(false);
        
            }
        });
        
        btnSend.setOnClickListener(listener)
        btnCancel.setOnClickListener(listener)  
        

        【讨论】:

        • 似乎任何时候 else 表达式会被调用,代码已经被窃听了。您期待一个按钮,但传递了其他东西。当v 不是Button 时,您应该 抛出异常。
        • 不是我的意思,但还是有所改进。
        • @JeroenBollen eelaborate please :) 好吧,我只看到一件事不一致,它是关于“错误视图传递给方法”的异常消息。此外,它只是试图展示它的外观。
        • 我的意思是当函数本身接收到null时,它已经是一个错误,它应该抛出一个异常。
        【解决方案10】:

        如果你需要禁用按钮添加这行代码。

        Button button = findViewById(R.id.button)
        button.setEnabled(false);
        

        并启用按钮,只需添加这一行

         button.setEnabled(true);
        

        编码愉快:D

        【讨论】:

          【解决方案11】:

          首先在 xml 中将按钮设为android:clickable="false"

          <Button
                  android:id="@+id/btn_send"
                  android:clickable="false"/>
          

          然后在您的代码中,在oncreate() 方法中将按钮属性设置为

          btn.setClickable(true);
          

          然后在按钮内点击更改代码为

          btn.setClickable(false);
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              btnSend = (Button) findViewById(R.id.btn_send);
              btnSend.setClickable(true);
              btnSend.setOnClickListener(new OnClickListener() {
          
                  @Override
                  public void onClick(View v) {
                      btnSend.setClickable(false);
          
                  }
              });
          }
          

          【讨论】:

            【解决方案12】:

            您可以禁用 xml 中的按钮,但这不是动态的。动态禁用按钮的最佳方法是。

            myButton.setEnabled(false);
            

            【讨论】:

              【解决方案13】:

              只需在 Java 中使用 setEnabled 方法即可。

              myButton.setEnabled(false); 
              

              在 Kotlin 中

              myButton.enabled = false
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-01-13
                • 2013-06-15
                • 2011-09-10
                • 1970-01-01
                • 2013-08-02
                • 2011-02-16
                • 1970-01-01
                • 2023-03-20
                相关资源
                最近更新 更多