2010-12-08 130 views
276

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

screen shot of sample layout

回答

616

你试过这个吗?

myButton.setEnabled(false); 

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

+17

没有等效的XML :-( – Blundell 2011-06-09 19:31:25

+47

相当于android:在xml中启用。 – Namratha 2013-02-26 09:35:53

+1

你在哪里找到这个文档?你能在这里链接吗? – Varun 2013-02-27 04:13:46

41

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

+0

5年的Android经验,我现在就了解这个! :/ – Sagar 2017-09-10 17:50:13

26

你只写一行代码在活动

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

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

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

在我的情况下,

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

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

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

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

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

在Java中,一旦你有按钮的参考:

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

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

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

或者:

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

由于您想禁用t按钮他开始,可以使用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" /> 
1

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

     } 
    }); 
} 
7

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

1

错误的方式 IN监听器,参数,而不是用变量!

btnSend.setOnClickListener(new OnClickListener() { 

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

    } 
}); 

RIGHT WAY:

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-博伦

View.OnClickListener 

为回调接口定义要时调用点击一个视图。

方法定义

void onClick(View v); 

当视图点击View类对象进行回调方法的onClick()发送的参数本身,因此,如果它确实是不应该出现空视图参数一个断言错误它可能发生,例如,当查看对象类同时被销毁(例如由GC收集)或方法由于被破解而被篡改时

很少约的instanceof &空

JLS/15.20.2。类型比较操作的instanceof

在运行时,如果RelationalExpression的值不为空 和参考可强制转换为引用类型 不提高一个ClassCastException instanceof运算符的结果为真 。

否则结果是错误的。从笔者

如果U问为什么


三个字?

主要是为了避免NullPointerException异常

多一点的代码将保存在以后的bug跟踪时间在你的代码&减少abnomalies的发生。

考虑下面的例子:

View.OnClickListener listener = new OnClickListener() { 

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

    } 
}); 

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

在科特林,如果你指的按钮来查看与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