我已经创建了一个包含两个按钮的布局,下一步和上一步。在按钮之间,我生成了一些动态视图。所以当我第一次启动应用程序时,我想禁用“Previous”按钮,因为不会有任何以前的视图。我还想禁用“下一步”按钮时,没有更多的视图显示。有办法禁用按钮吗?
当前回答
就我而言,
myButton.setEnabled(false);
myButton.setEnabled(true);
工作正常,它是启用和禁用按钮,因为它应该。但是一旦按钮状态变为禁用,它就再也不会回到启用状态,尽管它是可点击的。我尝试使可绘制状态无效并刷新,但运气不佳。
myButton.invalidate();
myButton.refreshDrawableState();
如果你或任何人有类似的问题,什么工作对我是设置背景绘图再次。适用于任何API级别。
myButton.setEnabled(true);
myButton.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.myButtonDrawable));
其他回答
如果你需要禁用按钮,添加这行代码。
Button button = findViewById(R.id.button)
button.setEnabled(false);
和启用按钮,只需添加这一行
button.setEnabled(true);
快乐编码:D
错误的方式在监听器中使用变量而不是参数!!
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
视图。OnClickListener 当单击视图时调用回调的接口定义。 使用方法定义 onClick(查看v);
当视图被单击时,视图类对象使回调方法onClick()发送作为参数本身,所以空视图参数不应该发生,如果它是一个断言错误,它可能发生,例如,当视图对象类被破坏的同时(例如由GC收集)或方法被篡改由于黑客
关于instanceof & null
JLS / 15.20.2。类型比较操作符实例 在运行时,instanceof操作符的结果为true 如果RelationalExpression的值不为空 并且引用可以转换为ReferenceType 而不引发ClassCastException。 否则结果为假。
来自作者的三个字
如果你问为什么?
主要是避免NullPointerException
更多的代码将节省您在代码中跟踪错误的时间,并减少异常的发生。
考虑下面的例子:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)
在Java中使用setEnabled方法即可。
myButton.setEnabled(false);
在Kotlin
myButton.enabled = false
有了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
你可以从xml中禁用一个按钮,但那不是动态的。动态禁用按钮的最佳方法是。
myButton.setEnabled(false);
推荐文章
- 视图绑定-我如何获得包含布局的绑定?
- 在Android Studio中改变矢量资产的填充颜色
- 在构建中编写注释的语法是什么?gradle文件?
- 如何以编程方式添加按钮色调
- 用Android Studio进行调试永远停留在“等待调试器”状态
- Openssl不被视为内部或外部命令
- 无法执行dex:在Eclipse中超过GC开销限制
- 如何以编程方式将视图添加到视图
- 单击url会打开默认浏览器
- 使用Retrofit刷新OAuth令牌,而不修改所有调用
- 多个dex文件定义了landoid /support/v4/accessibilityservice/AccessibilityServiceInfoCompat
- 如何获得动作栏的高度?
- 从活动外部调用startActivity() ?
- createScaledBitmap的过滤器参数做什么?
- 为什么我在使用adb时访问数据文件夹被拒绝?