我正在尝试通过for循环设置大量的OnClickListeners.每个视图都应该在单击时运行一个方法; view 0应该使用值0运行方法,使用值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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
这为每个单元格正确设置了OnClickListeners,但无论单击哪一个,它总是运行调用cellClicked,其值为21.
我知道我可以使用手动设置OnClickListeners cell[0]...cellClicked(0, v),但有没有办法做到这一点,以便ClickListener传递变量的值而不是对for循环中的变量的引用?
(我看到一些页面说Java通常使用传递值而不是引用来操作,但我认为Android库在某种程度上以不同方式执行,因此我遇到了困难.)
关于Android中的Java语义没有什么"特殊".
cellClicked在创建每个侦听器时实际上并不调用它,并且cellnumber不是每次创建的匿名类的本地调用,因此每个侦听器都引用相同的变量,从而获得相同的值.
使用该View.setTag()方法将单元ID附加到每个单元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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1851 次 |
| 最近记录: |