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