如何禁用Android按钮?


369

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

样本布局的屏幕截图

Answers:


799

你有尝试过吗?

myButton.setEnabled(false); 

更新:感谢格温。几乎android:clickable可以忘记在XML布局中设置以确定按钮是否可以单击的设置。


66
等效于xml中的android:enabled。
Namratha 2013年

1
您在文档中哪里找到的?您可以在这里链接吗?
Varun

4
@Namratha它仅适用于“按钮”小部件,不适用于作为按钮的
imageView

Xamarin等效项:myButton.Enabled = false;
卡梅伦前进

48

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


4
拥有5年的Android经验,我现在就知道这一点!:/
Sagar

35

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

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

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

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

20
那是2行。这是一。((Button)findViewById(R.id.mybutton)).setEnabled(false);
马特·克拉克

34
试着去理解Matt的感受。;)
Deepak Sharma

30

是的,可以使用以下命令在XML中禁用它:

<Button
android:enabled="false"
/>

2
这是xml的真正答案。搞砸了clickable的所有废话都与如何绘制按钮以使其看起来处于禁用状态无关。
Scott Biggs

1
我认为人们认为您无法执行此操作,因为AS / IDEA代码完成功能并不建议android:enabled您开始输入。(即使到今天。)
凯文Krumwiede

1
我试过它不起作用,仅从代码开始setEnabled起作用
FindOutIslamNow

23

在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" />

10年12月8日在7:08回答了Varun

1
@Poldie:实际上,如果您阅读了两个答案,您将理解它们非常相似,但并不相等。
Paolo Rovelli 2014年

9

就我而言

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

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

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

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

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

8

在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

2

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

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

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

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

        }
    });
}

2

错误地使用参数来替代参数!!!

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参数,这可能发生在例如同时销毁View对象类时(例如GC收集的示例)或方法因黑客入侵而被篡改

关于instanceof和null

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

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

否则结果为假


作者的三个字

如果问为什么?

避免使用NullPointerException

再多一点的代码将节省您在代码中进行后续错误跟踪的时间,并减少异常的发生。

考虑以下示例:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)  

2
好像在任何时候调用else表达式时,代码就已经被窃听了。您原本希望有一个按钮,但其他方面还是通过了。如果不是,则应引发异常。vButton
Jeroen

不是我的意思,而是一个进步。
Jeroen

@JeroenBollen请详细说明:)好的,我只看到一件事,这是关于“错误的视图传递给方法”的异常消息。此外,它只是试图显示它的外观。
ceph3us 2015年

我的意思是,当函数本身收到null时,它已经是一个错误,应该抛出异常。
Jeroen

1

有了Kotlin,您可以做到,

// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.