421

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

示例布局的屏幕截图

4

13 回答 13

883

你试过这个吗?

myButton.setEnabled(false); 

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

于 2010-12-08T07:08:07.160 回答
52

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

于 2011-08-24T12:37:41.590 回答
48

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

<Button
android:enabled="false"
/>
于 2015-03-13T05:35:08.507 回答
42

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

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

当您想启用相同的按钮时,只需编写

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
于 2012-11-30T13:58:38.143 回答
29

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

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

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

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

或者:

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

由于您想从一开始就禁用按钮,因此可以使用button.setEnabled(false); 在 onCreate 方法中。否则,从 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" />
于 2013-09-11T16:18:01.727 回答
10

就我而言,

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

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

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

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

myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
于 2012-12-14T15:12:20.723 回答
10

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

布局.xml

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

活动.kt

  btn_start.isEnabled = true   //to enable button
  btn_start.isEnabled = false  //to disable button
于 2017-11-15T12:04:19.500 回答
6

使用 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
于 2020-03-02T18:12:01.790 回答
4

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

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);

当单击视图时,视图类对象会回调方法 onClick() 作为参数本身发送,因此如果它是一个断言错误,则不应出现空视图参数,例如,当视图对象类同时被销毁时(例如GC收集的示例)或方法因黑客攻击而被篡改

关于instanceof & null

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

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

否则结果为 false


作者的三个字

如果你问为什么?

主要是为了避免 NullPointerException

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

考虑以下示例:

View.OnClickListener listener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        btnSend.setClickable(false);

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  
于 2015-06-29T14:32:00.903 回答
4

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

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

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

 button.setEnabled(true);

快乐编码:D

于 2020-12-14T10:51:30.727 回答
3

首先在 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);

        }
    });
}
于 2014-10-01T09:29:54.103 回答
1

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

myButton.setEnabled(false);
于 2021-09-17T02:36:49.973 回答
-1

只需在 Java 中使用 setEnabled 方法。

myButton.setEnabled(false); 

在科特林

myButton.enabled = false
于 2021-06-21T06:17:49.867 回答