如何管理动态创建的按钮的 onClickListener?

How can I manage onClickListener of a dynamically created button?

我正在尝试根据用户选择的选项创建 'n' 按钮。按钮的范围可以从 1 到 3。但是,当我尝试根据按下的按钮更新变量时遇到困难。它给出了错误 "Variable used in lambda expression should be final or effectively final"。我了解错误,但无法弄清楚如何解决此问题。这是我的示例代码:

        for (int i = 0; i < options; i++) {
            Button button = new Button(this);
            button.setId(position);
            buttons[i] = button;
            buttons[i].setOnClickListener(v -> {
                tempToMaintain.setValue(listParameters.get(i));

            });
        }

'options' 包含要创建的按钮数,tempToMaintain 是一个从 Firebase 引用的变量。我正在尝试从列表中获取值并在 Firebase 上更新它。我怎样才能做到这一点,非常感谢任何帮助。

在 Java 你不能在 lambda 和匿名内部 [=36] 中使用非最终(以及 非有效最终)变量=]es.

您可以通过创建实现 View.OnClickListener 接口的 class 并将变量 i 作为构造函数参数来摆脱 lambda 表达式.

例如:

class MyButtonClickListener implements View.OnClickListener {
   private int parameterIndex;

   public MyButtonClickListener(int parameterIndex) {
      this.parameterIndex = parameterIndex;
   }

   public void onClick(View v) {
      tempToMaintain.setValue(listParameters.get(parameterIndex));
   }
}

应该就是这样。如果您的新 class 实例无法根据上下文访问它们。

现在您可以将对 clickListener 事件处理程序的绑定更改为:

for (int i = 0; i < options; i++) {
   Button button = new Button(this);
   button.setId(position);
   buttons[i] = button;
   buttons[i].setOnClickListener(new MyButtonClickListener(i));
}

希望这对您有所帮助。