【问题标题】:How can I manage onClickListener of a dynamically created button?如何管理动态创建的按钮的 onClickListener?
【发布时间】:2020-06-26 23:34:52
【问题描述】:

我正在尝试根据用户选择的选项创建“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】:

    在 Java 中,您不能在 lambda 以及匿名内部类中使用非最终(以及非有效最终)变量。

    您可以通过创建一个实现 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));
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多