如何禁用Android按钮?

如何禁用Android按钮?,android,android-button,Android,Android Button,我已经创建了一个包含两个按钮的布局,下一个和上一个。在按钮之间,我生成了一些动态视图。因此,当我第一次启动应用程序时,我想禁用“Previous”按钮,因为之前不会有任何视图。我还想在没有更多视图显示时禁用“下一步”按钮。是否仍有禁用按钮的方法 你试过这个吗 myButton.setEnabled(false); 更新:感谢Gwen。几乎忘记了,android:clickable可以在XML布局中设置,以确定按钮是否可以单击。您不能在XML中启用或禁用它(因为您的布局是在运行时设置的),但是

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

你试过这个吗

myButton.setEnabled(false); 

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

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

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

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
当您想要启用相同的按钮时,只需写

Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
就我而言

myButton.setEnabled(false);
myButton.setEnabled(true);
正在正常工作,并按其应有的方式启用和禁用按钮。但一旦按钮状态变为禁用状态,它就再也不会回到启用状态,尽管它是可单击的。我试图使可拖动状态无效并刷新,但没有成功

myButton.invalidate();
myButton.refreshDrawableState();
如果你或任何人有类似的问题,什么工作对我来说是设置背景画再次。适用于任何API级别

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

在Java中,一旦获得按钮的引用:

Button button = (Button) findviewById(R.id.button);
要启用/禁用按钮,您可以使用:

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

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

android:clickable = "false"
因此:


首先使用xml将按钮设置为android:clickable=“false”

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

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

        }
    });
}

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

<Button
android:enabled="false"
/>

监听器中使用变量而不是参数的方法错误

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

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

使用方法定义

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

几乎没有关于instanceof&null的信息

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!");
             }
          }
       }
    });
JLS/15.20.2。类型比较运算符instanceof

在运行时,instanceof运算符的结果为true 如果RelationalExpression的值不为null 引用可以强制转换为ReferenceType 没有引起ClassCastException

否则结果为假


作者的三个字

如果你问为什么?

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!");
             }
          }
       }
    });
主要是为了避免NullPointerException

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!");
             }
          }
       }
    });
多一点代码将节省您在代码中跟踪bug的时间,减少异常的发生

考虑以下示例:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

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

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

有了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

如果需要禁用按钮,请添加这行代码

Button button = findViewById(R.id.button)
button.setEnabled(false);
和启用按钮,只需添加此行

 button.setEnabled(true);

快乐编码:D

等价物是xml中启用的android:enabled。您在文档中从哪里找到的?你能把它链接到这里吗?@Namratha它只是为“按钮”小部件工作,而不是为imageView作为一个ButtonShamarin等价物:myButton.Enabled=false;那是两行。这是一个<代码>((按钮)findViewById(R.id.mybutton)).setEnabled(false)试着去理解感觉(马特…)12月8日10时7分答复Varun@Poldie:实际上,如果你读了这两个答案,你就会明白它们非常相似,但并不相等。似乎任何时候调用else表达式,代码都已经被窃听了。你本以为会有一个按钮,但却传来了别的东西。当
v
不是
按钮时,您应该抛出一个异常。这与我的意思不完全一样,但还是有所改进。@JeroenBollen eelaborate:)好的,我只看到一件事不一致,它是关于“传递给方法的视图错误”的异常消息。此外,它只是试图展示它应该是什么样子。我的意思是,当函数本身接收null时,它已经是一个bug,应该抛出一个异常。这是xml的真正答案。所有那些搞乱clickable的胡说八道与按钮的绘制方式无关。我认为人们认为你不能这样做,因为AS/IDEA代码完成并不建议你在开始键入时启用android:enabled
。(直到今天)我试过它不起作用,只是从code
setEnabled
在Android上工作了5年,我现在知道了!://要启用按钮myButton.isEnabled=false
// to disable clicks
myButton.isClickable = false 

// to disable button
myButton.isEnabled = false

// to enable clicks
myButton.isClickable = true 

// to enable button
myButton.isEnabled = true
Button button = findViewById(R.id.button)
button.setEnabled(false);
 button.setEnabled(true);