如何禁用Android按钮?

时间:2010-12-08 06:48:54

标签: android layout button

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

screen shot of sample layout

12 个答案:

答案 0 :(得分:725)

你试过这个吗?

myButton.setEnabled(false); 

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

答案 1 :(得分:47)

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

答案 2 :(得分:31)

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

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

如果要启用相同的按钮,只需编写

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

答案 3 :(得分:23)

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

答案 4 :(得分:19)

是的,可以在XML中禁用它 只是用 <Button android:enabled="false" />

答案 5 :(得分:8)

就我而言,

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

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

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

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

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

答案 6 :(得分:4)

在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

答案 7 :(得分:2)

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

        }
    });
}

答案 8 :(得分: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()作为参数本身发送,因此如果它执行了断言错误,则不应出现null视图参数例如,当View对象类被同时销毁时(例如由GC收集)或者方法因黑客攻击而被篡改

instanceof&amp; null

  

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

     

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

     

否则结果为假

作者的三个字

如果你问为什么?

绝对要避免NullPointerException

稍微多一点的代码可以节省您的代码中的后续错误跟踪时间。减少异常的发生。

请考虑以下示例:

View.OnClickListener listener = new OnClickListener() {

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

    }
});

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

答案 9 :(得分:2)

借助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

答案 10 :(得分:0)

如果您需要禁用按钮,请添加以下代码行。

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

然后启用按钮,只需添加此行

 button.setEnabled(true);

快乐编码:D

答案 11 :(得分:-1)

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

span , a {
  display: inline-table;
  padding: 25px;
  background: dodgerblue;
}

在 Kotlin 中

myButton.setEnabled(false);