如何禁用Android按钮?

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

示例布局的屏幕截图

你试过这个吗?

myButton.setEnabled(false); 

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

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

你只要在你的活动中写一行代码

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

当你想启用相同的按钮只需写入

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

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

所以:

  

就我而言,

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

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

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

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

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

是的,只要使用就可以禁用XML

首先在xml中使按钮为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); } }); } 

错误的方式在听者使用variables的参数!

 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视图参数,如果它是一个断言错误它可能发生,例如,当视图对象类被破坏的同时由GC收集的例子)或方法被黑客篡改

一点关于instanceof&null

JLS / 15.20.2。 types比较运算符instanceof

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

否则结果是错误的


作者三个字

如果你问为什么?

主要是为了避免NullPointerException

更多的代码将节省您的时间在以后的代码错误跟踪和减少exception的发生。

考虑下面的例子:

 View.OnClickListener listener = new OnClickListener() { @Override public void onClick(View v) { btnSend.setClickable(false); } }); btnSend.setOnClickListener(listener) btnCancel.setOnClickListener(listener) 

在Kotlin中,如果您将Button View与id关联,那么启用/禁用按钮就像

layout.xml

  

activity.kt

  btn_start.isEnabled = true //to enable button btn_start.isEnabled = false //to disable button