Android 在编程创建的ImageButtons中定义的putExtra数据只看到最后一个值?

Android 在编程创建的ImageButtons中定义的putExtra数据只看到最后一个值?,android,android-intent,imagebutton,Android,Android Intent,Imagebutton,我已经通过编程在for循环中定义了一组imagebutton。对于每个按钮,我定义了其setOnClickListener函数,该函数将在intent中放入一些数据,然后切换活动。然而,似乎无论我点击哪个按钮,检索到的额外数据都被设置为for循环中的最后一个值。请参见此处的代码: public void onCreate(Bundle savedInstanceState) { <...> RelativeLayout rl = (RelativeLayout

我已经通过编程在for循环中定义了一组imagebutton。对于每个按钮,我定义了其setOnClickListener函数,该函数将在intent中放入一些数据,然后切换活动。然而,似乎无论我点击哪个按钮,检索到的额外数据都被设置为for循环中的最后一个值。请参见此处的代码:

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);

                }
            });
public void onCreate(Bundle savedInstanceState){
RelativeLayout rl=(RelativeLayout)findViewById(R.id.rlayout);

对于(inti=1;i,可以使用当前的mapLocation值向按钮添加标记

btnMapLoc.setTag(i);
...

// In onClick
    intent.putExtra("MapLocation", v.getTag());
    ...

之所以只获取
mapLocation
的最后一个值,是因为onClick()中的代码当用户按下按钮时运行。换句话说,在循环生成按钮很久之后,您正在查询
mapLocation
。您需要在每个循环迭代中创建对当前
mapLocation
的引用,就像使用标记功能一样。

您可以使用当前mapLocation值向按钮添加标记

btnMapLoc.setTag(i);
...

// In onClick
    intent.putExtra("MapLocation", v.getTag());
    ...

之所以只获取
mapLocation
的最后一个值,是因为onClick()中的代码当用户按下按钮时运行。换句话说,在循环构建按钮很久之后,您正在查询
mapLocation
。您需要在每个循环迭代中创建对当前
mapLocation
的引用,就像使用标记功能一样。

您可能需要在onClick方法中打印按钮的ID,以确保t您单击的按钮实际上是您期望被触发的按钮。因此,第一个按钮的ID应为'2001',第二个按钮的ID应为'2002'。您可能希望在onClick方法中打印出按钮的ID,以确保您单击的按钮实际上是您期望被触发的按钮。因此,第一个按钮应该有'2001'的ID,第二个按钮应该有'2002'的ID。谢谢。get-和setTag函数成功了!我不知道onClick()中的代码在运行时是“源代码”的。我认为内部调用的实现是“复制和存储”的在创建视图的每个实例中,动态赋值都会记录在内存中……谢谢。get和setTag函数成功了!我不知道onClick()中的代码在运行时是“源代码”的。我认为内部调用的实现是“复制和存储”的在创建视图的每个实例中,动态赋值都会记录在内存中。。。