我以编程方式在for循环中定义了一组图像按钮。对于每个按钮,我定义了它的setOnClickListener函数,该函数将一些数据放入intent中,然后切换活动。但是,似乎无论我点击哪个按钮,检索到的额外数据都设置为循环中的最后一个值。请参阅此处的代码:
public void onCreate(Bundle savedInstanceState) {
<...>
RelativeLayout rl = (RelativeLayout) findViewById(R.id.rlayout);
for (int i=1; i<=maxMapLoc; i++ ) {
mapLocation = i;
ImageButton btnMapLoc = new ImageButton(FirstActivity.this);
RelativeLayout.LayoutParams vp = new RelativeLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
btnMapLoc.setLayoutParams(vp);
btnMapLoc.setBackgroundColor(Color.TRANSPARENT);
btnMapLoc.requestLayout();
String imgName = "map_loc_" + mapLocation;
int id = getResources().getIdentifier(imgName,"drawable",getPackageName());
btnMapLoc.setImageResource(id);
int imgMapLoc = 2000 + mapLocation;
btnMapLoc.setId(imgMapLoc);
rl.addView(btnMapLoc, vp);
btnMapLoc.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("MapLocation", mapLocation);
startActivity(intent);
}
});
知道我做错了吗?
感谢。
答案 0 :(得分:3)
您可以使用当前的mapLocation值为您的按钮添加标记。
btnMapLoc.setTag(i);
...
// In onClick
intent.putExtra("MapLocation", v.getTag());
...
您只获得mapLocation
的最后一个值的原因是,当用户按下按钮时,onClick()中的代码就会运行。换句话说,您在循环构建按钮后很长时间内查询mapLocation
。您需要在每次循环迭代中创建对当前mapLocation
的引用,就像标记功能一样。