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

标签 java android android-studio onclicklistener buttonclick

我正在尝试根据用户选择的选项创建“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 中,不能在 lambda 和匿名内部类中使用非最终(以及非有效最终)变量。

您可以通过创建一个实现 View.OnClickListener 接口(interface)的类并为其提供变量 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 事件处理程序的绑定(bind)更改为如下所示:

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

希望这有帮助。

关于java - 如何管理动态创建按钮的 onClickListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60696095/

相关文章:

java - 如何从 Amazon S3 下载图像并将其保存到 ImageView

android - Android Studio 中未启用翻译编辑器

Android Studio 不会安装新的 APK - 旧的不会在手机上消失

java - 尝试解决 SSLHandshakeException 时获取 SocketTimeoutException

java - @Transactional 在 JUnit 测试中不回滚

android - AsyncTask 完成后在 ListView 上设置 OnItemClickListener

用于全屏模式的 Android Studio 键盘快捷键

java - Java 接口(interface)的实现应该驻留在哪个包中?

Java 8 按多个字段分组到单个映射中

java - 如何更改 Java 文件的字体大小和字体颜色?