好的,我会尽力帮助您解释您的代码:
public void setButton(final Button b, final boolean check) {
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (check == true){
b.setText("FALSE");
check = false; //HERE IS THE ERROR
}
else{
}
}
});
}
你调用 b.setOnClickListener(new ...) new 创建了一个实现View.OnClickListener 接口的类的隐式匿名实例。
您可以通过在文本光标位于单词OnClickListener 的某个位置时简单地按Ctrl-B 来验证OnClickListener 是一个接口。这会将您带到光标下方任何项目的声明。
由于它是一个新 东西,它是一个新实例,因此与您的方法public void setButton... 所在的类/实例不同。
在 Java 中,如果您从 inner 类(您的点击听众)他们必须是最终的。换句话说:只读。
为了解决您的问题,我建议您使用b.setChecked,就像使用b.setText 一样,并将选中状态直接分配给按钮。
您还可以通过调用b.isChecked读取按钮的选中状态,然后完全消除参数check。你不需要它。
因此,您的工作方法如下所示:
public void setButton(final Button b) {
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (b.isChecked()){
b.setText("FALSE");
b.setChecked(false);
}
else{
}
}
});
}
甚至更容易,如果您只想让您的按钮在您单击它时交换其选中状态(true/false/true/false...),它看起来像这样:
public void setButton(final Button b) {
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
b.setChecked(!b.isChecked());
b.setText(String.valueOf(b.isChecked());
}
});
}
这是做什么的?
b.setChecked(!b.isChecked());
用人类的话来说:“将按钮的选中状态设置为非当前选中状态”。所以如果它是真的,它就会是假的,反之亦然。
嗯,.setText 也不是黑魔法。只需打印布尔值。
String.valueOf(any_boolean) 将返回“true”或“false”。
希望这能帮助你理解。
编辑
正如您正确提到的,Button 不能是checked。如果您需要 GUI 中的按钮,您可以派生自己的按钮来实现。
public class CheckButton extends Button {
private boolean checked = false;
public boolean isChecked { return checked; }
public void setChecked(boolean checked) { this.checked = checked; }
}
然后修改您的 XML 以使用 CheckButton 而不是 Button 和您的方法以使用 final CheckButton b 作为参数。