【发布时间】:2011-05-22 01:22:27
【问题描述】:
我创建了一个布局,其中包含两个按钮,下一个和上一个。在按钮之间,我生成了一些动态视图。因此,当我第一次启动应用程序时,我想禁用“上一个”按钮,因为不会有任何以前的视图。当没有更多视图可显示时,我还想禁用“下一步”按钮。有没有禁用按钮?
【问题讨论】:
我创建了一个布局,其中包含两个按钮,下一个和上一个。在按钮之间,我生成了一些动态视图。因此,当我第一次启动应用程序时,我想禁用“上一个”按钮,因为不会有任何以前的视图。当没有更多视图可显示时,我还想禁用“下一步”按钮。有没有禁用按钮?
【问题讨论】:
你试过了吗?
myButton.setEnabled(false);
更新:感谢格温。差点忘了android:clickable可以在你的XML布局中设置来判断一个按钮是否可以点击。
【讨论】:
您无法在 XML 中启用或禁用它(因为您的布局是在运行时设置的),但您可以使用android:clickable 设置它是否可以在活动启动时点击。
【讨论】:
是的,它可以在 XML 中禁用 只是使用:
<Button
android:enabled="false"
/>
【讨论】:
android:enabled。 (直到今天。)
setEnabled是工作
您只需在活动中编写一行代码
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);
在 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" />
【讨论】:
就我而言,
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
【讨论】:
使用 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
【讨论】:
错误的方式在侦听器中使用变量而不是参数!!!
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 对象类同时被销毁(例如被 GC 收集)或方法因 hack 被篡改时
关于instanceof & null
JLS / 15.20.2。类型比较运算符 instanceof
在运行时,instanceof 运算符的结果为真 如果 RelationalExpression 的值不为空 并且可以将引用转换为 ReferenceType 不引发 ClassCastException。
否则结果为假。
作者三句话
如果你问为什么?
主要是为了避免 NullPointerException
更多的代码将节省您在以后的代码中跟踪错误的时间,并减少异常的发生。
考虑以下示例:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)
【讨论】:
v 不是Button 时,您应该 抛出异常。
如果你需要禁用按钮添加这行代码。
Button button = findViewById(R.id.button)
button.setEnabled(false);
并启用按钮,只需添加这一行
button.setEnabled(true);
编码愉快:D
【讨论】:
首先在 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);
}
});
}
【讨论】:
您可以禁用 xml 中的按钮,但这不是动态的。动态禁用按钮的最佳方法是。
myButton.setEnabled(false);
【讨论】:
只需在 Java 中使用 setEnabled 方法即可。
myButton.setEnabled(false);
在 Kotlin 中
myButton.enabled = false
【讨论】: