java - 在 OnClickListener() 中传递变量的值而不是引用

标签 java android

我正在尝试通过 for 循环设置大量 OnClickListener。每个 View 在单击时都应该运行一个方法; View 0 应该运行值为 0 的方法, View 1 应该运行值为 1 的方法,等等。

但是,如果我使用通过 for 循环递增的变量声明 OnClickListener,则 OnClickListener 会记住对该变量的引用,而不是声明该变量时的值。

这可能不是很清楚 - 这是代码:

for (int i = 0; i < 20; i++) {
    cells[i] = (ImageView) findViewById(cellIDs[i]);
    cells[cellnumber++].setOnClickListener(new OnClickListener() {
    public void onClick(View v){
          cellClicked(cellnumber, v);
       }
    });
}

这为每个单元格正确设置了 OnClickListeners,但无论单击哪一个单元格,它总是运行值为 21 的 cellClicked 调用。

我知道我可以使用 cell[0] 手动设置 OnClickListeners。 。 。 cellClicked(0, v), 但是有没有办法让 ClickListener 传递变量的值而不是 for 循环中对变量的引用?

(我看到一些页面说 Java 通常通过传递值而不是引用进行操作,但我认为 Android 库以某种方式以不同的方式执行此操作,因此我在这里遇到困难。)

最佳答案

Android 中的 Java 语义没有什么“特殊”之处。

cellClicked 在您创建每个监听器时实际上并未被调用,并且 cellnumber 对于您每次创建的匿名类来说都不是本地的,因此每个监听器都是引用相同的变量,从而获得相同的值。

使用View.setTag()方法将单元格 ID 附加到每个View。然后,您只需要一个监听器实例,该实例在其 onClick 方法中调用 v.getTag() 来获取单元格 ID。

编辑:
这是一些完全未经测试的代码。我实际上不知道你是否可以像这样转换一个盒装整数。无论如何,这是一个开始:

OnClickListener listener = new OnClickListener() {
    public void onClick(View v) {
        int cellId = (int) v.getTag();
        cellClicked(cellId, v);
    }
}

View v;
for (int i = 0; i < 20; i++) {
    v = findViewById(cellIDs[i]);
    v.setOnClickListener(listener);
    v.setTag(i);
}

关于java - 在 OnClickListener() 中传递变量的值而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031830/

相关文章:

java - OSM xml 损坏?

java - 使用 Scanner 时 For 循环在 1 次旋转后结束

java - 有没有一种方法可以让一个具有泛型类型的接口(interface)扩展另一个具有 Java 中另一个泛型类型的接口(interface)?

java - 禁用主机在 WiFiP2PManager 中接受连接的对话框

android - 即使两周后也无法在 Google Play 商店中找到应用程序,但它就在那里

android - 在 Android 中更改选项卡时更改菜单

java - 加点机制麻烦?

java - JavaServer Faces 领先一步

android - RelativeLayout 中的 ScrollView

java - 使用 Json 创建水平滚动条?