【问题标题】:Android Studio - (Final) function parametersAndroid Studio - (Final) 函数参数
【发布时间】:2017-02-25 14:07:20
【问题描述】:

所以我正在尝试在没有适当学习资源的情况下学习 Java。我有一个带有 3 个按钮的代码,并且想要创建一个带有 2 个参数的函数,这些参数会改变它们的文本和布尔变量,但这似乎是不可能的,因为它们需要被声明为 final。

boolean btn1Check = false;
boolean btn2Check = false;
boolean btn3Check = false;

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
            }
        }
    });
}

如果我不声明那些最终的,它会给我一个不同的错误。我不知道该怎么办。

【问题讨论】:

    标签: java android variables android-button final


    【解决方案1】:

    发生这种情况是因为您无法从内部类更改变量的值。此外,更改check 变量的值没有意义,因为它的作用域以setButton 方法执行结束。

    如果你想改变Button 状态,你应该在按钮本身上工作,比如:

    b.setChecked(false);
    

    【讨论】:

      【解决方案2】:

      好的,我会尽力帮助您解释您的代码:

      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 作为参数。

      【讨论】:

      • 我使用了常规的 Button,我得到一个错误,说它无法解析方法 setChecked 和 isChecked
      • 你是对的。无法检查Button。请改用CheckBox。对不起。或者,您从 Button 派生自己的 Button 类,并使用 checked 字段对其进行扩展。我更新了答案以向您展示代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2020-09-24
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      相关资源
      最近更新 更多