Answers:
您无法在XML中启用或禁用它(因为布局是在运行时设置的),但是您可以使用来设置在活动启动时是否可点击它android:clickable
。
您只需在活动中编写一行代码
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
当您想启用相同的按钮时,只需编写
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
((Button)findViewById(R.id.mybutton)).setEnabled(false);
是的,可以使用以下命令在XML中禁用它:
<Button
android:enabled="false"
/>
android:enabled
您开始输入。(即使到今天。)
setEnabled
起作用
在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" />
就我而言
myButton.setEnabled(false);
myButton.setEnabled(true);
工作正常,它正在启用和禁用按钮。但是一旦按钮状态变为禁用状态,尽管它是可单击的,但再也不会返回到启用状态。我尝试使绘画状态无效并刷新,但是没有运气。
myButton.invalidate();
myButton.refreshDrawableState();
如果您或遇到类似问题的任何人,对我有用的是再次设置背景可绘制。适用于任何API级别。
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
在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
首先在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);
}
});
}
错误地使用参数来替代参数!!!
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)
v
Button