我正在尝试通过 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/