如何禁用Android按钮?
我已经创建了一个包含两个按钮的布局,下一个和上一个。在按钮之间,我生成了一些动态视图。因此,当我第一次启动应用程序时,我想禁用“Previous”按钮,因为之前不会有任何视图。我还想在没有更多视图显示时禁用“下一步”按钮。是否仍有禁用按钮的方法 你试过这个吗如何禁用Android按钮?,android,android-button,Android,Android Button,我已经创建了一个包含两个按钮的布局,下一个和上一个。在按钮之间,我生成了一些动态视图。因此,当我第一次启动应用程序时,我想禁用“Previous”按钮,因为之前不会有任何视图。我还想在没有更多视图显示时禁用“下一步”按钮。是否仍有禁用按钮的方法 你试过这个吗 myButton.setEnabled(false); 更新:感谢Gwen。几乎忘记了,android:clickable可以在XML布局中设置,以确定按钮是否可以单击。您不能在XML中启用或禁用它(因为您的布局是在运行时设置的),但是
myButton.setEnabled(false);
更新:感谢Gwen。几乎忘记了,android:clickable可以在XML布局中设置,以确定按钮是否可以单击。您不能在XML中启用或禁用它(因为您的布局是在运行时设置的),但是,您可以使用设置活动启动时是否可以单击它。您只需在活动中编写一行代码即可
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(false);
当您想要启用相同的按钮时,只需写
Button btn = (Button) findViewById(R.id.button1);
btn.setEnabled(true);
就我而言
myButton.setEnabled(false);
myButton.setEnabled(true);
正在正常工作,并按其应有的方式启用和禁用按钮。但一旦按钮状态变为禁用状态,它就再也不会回到启用状态,尽管它是可单击的。我试图使可拖动状态无效并刷新,但没有成功
myButton.invalidate();
myButton.refreshDrawableState();
如果你或任何人有类似的问题,什么工作对我来说是设置背景画再次。适用于任何API级别
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
在Java中,一旦获得按钮的引用:
Button button = (Button) findviewById(R.id.button);
要启用/禁用按钮,您可以使用:
button.setEnabled(false);
button.setEnabled(true);
或:
因为您想从一开始就禁用按钮,所以可以使用button.setEnabled(false);在onCreate方法中。
否则,从XML中,您可以直接使用:
android:clickable = "false"
因此:
首先使用xml将按钮设置为android:clickable=“false” 然后在按钮内单击将代码更改为
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中禁用 仅使用:
<Button
android:enabled="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
是接口定义,用于在单击视图时调用回调
使用方法定义
void onClick(View v);
单击视图时,视图类对象回调方法onClick(),并将其作为参数本身发送,因此,如果出现空视图参数,则不应出现空视图参数。这是一个断言错误,例如,当视图对象类同时被销毁时(例如由GC收集)或方法因黑客攻击而被篡改
几乎没有关于instanceof&null的信息
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!");
}
}
}
});
JLS/15.20.2。类型比较运算符instanceof
在运行时,instanceof运算符的结果为true
如果RelationalExpression的值不为null
引用可以强制转换为ReferenceType
没有引起ClassCastException
否则结果为假
作者的三个字 如果你问为什么?
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!");
}
}
}
});
主要是为了避免NullPointerException
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!");
}
}
}
});
多一点代码将节省您在代码中跟踪bug的时间,减少异常的发生
考虑以下示例:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)
在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"/>
有了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
如果需要禁用按钮,请添加这行代码
Button button = findViewById(R.id.button)
button.setEnabled(false);
和启用按钮,只需添加此行
button.setEnabled(true);
快乐编码:D等价物是xml中启用的android:enabled。您在文档中从哪里找到的?你能把它链接到这里吗?@Namratha它只是为“按钮”小部件工作,而不是为imageView作为一个ButtonShamarin等价物:myButton.Enabled=false;那是两行。这是一个<代码>((按钮)findViewById(R.id.mybutton)).setEnabled(false)代码>试着去理解感觉(马特…)12月8日10时7分答复Varun@Poldie:实际上,如果你读了这两个答案,你就会明白它们非常相似,但并不相等。似乎任何时候调用else表达式,代码都已经被窃听了。你本以为会有一个按钮,但却传来了别的东西。当
v
不是按钮时,您应该抛出一个异常。这与我的意思不完全一样,但还是有所改进。@JeroenBollen eelaborate:)好的,我只看到一件事不一致,它是关于“传递给方法的视图错误”的异常消息。此外,它只是试图展示它应该是什么样子。我的意思是,当函数本身接收null时,它已经是一个bug,应该抛出一个异常。这是xml的真正答案。所有那些搞乱clickable的胡说八道与按钮的绘制方式无关。我认为人们认为你不能这样做,因为AS/IDEA代码完成并不建议你在开始键入时启用android:enabled
。(直到今天)我试过它不起作用,只是从codesetEnabled
在Android上工作了5年,我现在知道了!://要启用按钮myButton.isEnabled=false
// to disable clicks
myButton.isClickable = false
// to disable button
myButton.isEnabled = false
// to enable clicks
myButton.isClickable = true
// to enable button
myButton.isEnabled = true
Button button = findViewById(R.id.button)
button.setEnabled(false);
button.setEnabled(true);