如何管理动态创建的按钮的 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));
}
希望这对您有所帮助。
我正在尝试根据用户选择的选项创建 '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));
}
希望这对您有所帮助。