簡體   English   中英

如何管理動態創建的按鈕的 onClickListener?

[英]How can I manage onClickListener of a dynamically created button?

我正在嘗試根據用戶選擇的選項創建“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接口的類並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));
}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM