Android:动态生成的ImageButtons数组仅返回单击时创建的最后一个信息

时间:2012-08-02 18:27:14

标签: android dynamic for-loop settext

我有一个生成并显示自定义ImageButtons的GridLayout的活动,名为MapCells(这是一个游戏地图,令人惊讶。)MapCells是随机生成的,包含一些与地形类型相关的变量以及看起来不同的(图像) 。当我运行我的代码时会发生什么,我得到了我可爱的随机地图,当我点击单元格时,他们应该在屏幕上提供他们的id(一个诊断辅助工具)以及获取他们存储的变量和setText-ing到一些TextViews在同一个活动中。当我点击MapCells时,它实际上是如何工作的,它们是唯一的id(如预期的那样),并且具有独特的外观,但显示的地形值是在所有情况下生成的最后一个MapCell。我认为这是我的'for'循环创建所有MapCells作为变量q(在注释掉的代码中可见)的结果,我只是覆盖了每个循环,所以我把它重写为下面的代码,但是,我得到了一样的问题。我看过的其他问题似乎表明,给他们提供ID可以解决这个问题。有什么想法吗?

package com.<redacted>

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;

public class MapScreen extends Activity implements OnClickListener{
    private static int dimen = 110; //the side length of map cells
    private int currentFood;
    private String currentName;
    private MapCell[] storage = new MapCell[18];//keep the cells in here

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_screen); //the xml

  //It's Randy the randomizer!
    Random randy = new Random();

    //Generate 6 random MapCells per row for use in our map.
    //MapCell q; -this is old and unused now
    for(int i=0; i<=5; i++){
        //q = new MapCell(randy.nextInt(4), this); //create and randomize
        //q.setId(i); //issue identity
        storage[i] = new MapCell(randy.nextInt(4), this); //shove it in the array
        storage[i].setId(i);
        storage[i].setOnClickListener((OnClickListener) this);
        //q.setOnClickListener((OnClickListener) this);
        ((TableRow)findViewById(R.id.mapRow01)).addView(storage[i], dimen, dimen); //add cell to display
    }
    for(int j=0; j<=5; j++){
        //q = new MapCell(randy.nextInt(4), this);
        //q.setId(j+6);
        //storage[q.getId()] = q; //shove it in the array
        //q.setOnClickListener((OnClickListener) this);
        storage[j+6] = new MapCell(randy.nextInt(4), this); //shove it in the array
        storage[j+6].setId(j+6);
        storage[j+6].setOnClickListener((OnClickListener) this);
        ((TableRow)findViewById(R.id.mapRow02)).addView(storage[j+6], dimen, dimen); //add cell to display
    }
    for(int k=0; k<=5; k++){
        //q = new MapCell(randy.nextInt(4), this);
        //q.setId(k+12);
        //storage[q.getId()] = q; //shove it in the array
        //q.setOnClickListener((OnClickListener) this);
        storage[k+12] = new MapCell(randy.nextInt(4), this); //shove it in the array
        storage[k+12].setId(k+12);
        storage[k+12].setOnClickListener((OnClickListener) this);
        ((TableRow)findViewById(R.id.mapRow03)).addView(storage[k+12], dimen, dimen); //add cell to display
    }
}

public void displayCell(MapCell view){
    //get the cell name view and then set its text to be the name of the clicked cell
    try{ //we need to try in case it feeds in a non-MapCell view
        currentName = storage[view.getId()].getName();
        ((TextView)findViewById(R.id.mapDisplayName)).setText(currentName);
        currentFood = storage[view.getId()].getFood();
        ((TextView)findViewById(R.id.mapDisplayFood)).setText(String.valueOf(currentFood));
        Toast.makeText(this, "Cell " + String.valueOf(view.getId()), Toast.LENGTH_SHORT).show(); //diagnostic line
    }
    catch (Exception x){
        //frowny time
        Toast.makeText(this, "Something Broke on cell " + String.valueOf(view.getId()) + " :(", Toast.LENGTH_SHORT).show();
    }
}

public void onClick(View v){//when we click a MapCell
    displayCell((MapCell)v);// feed it in
}

}

这是相关课程。如果你问的话,我可以告诉你MapCell,但它只是一个带有一些附加变量的ImageButton,用于乘坐吸气剂。这些变量由switch case使用构造函数中提供的随机整数设置。

1 个答案:

答案 0 :(得分:1)

我认为您的代码没有任何问题,我会在黑暗中拍摄。在MapCell类中,是否包含使用 static 修饰符定义的地形值的变量?