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

问题描述 投票:0回答:1

我正在尝试根据用户选择的选项创建'n'个按钮。这些按钮的范围可以从1到3。但是,当我尝试根据按下的按钮来更新变量时,我遇到了困难。它给出错误“ lambda表达式中使用的变量应该是最终的或实际上是最终的”。我了解错误,但无法弄清楚如何解决此问题。这是我的示例代码:

        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 android android-studio onclicklistener buttonclick
1个回答
1
投票

在Java中,您不能在lambda以及匿名内部类中使用非最终变量(也不能使用non-effectively-final)。

您可以通过创建实现View.OnClickListener接口的类并为它提供变量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));
   }
}

就应该这样。如果新类实例无法上下文访问它们,则将tempToMaintainlistParameters作为构造函数参数传递(就像我们对parameterIndex所做的那样)。

现在您可以更改与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));
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.