views:

43

answers:

3

Hey there. My app is going to be using an array of 64 ImageButtons (8x8), and they're all already declared in my XML Layout with names like one1, two5, eight8, etc. Rather than declare these each individually in my Java I thought it might be smart to declare them all in some for loops. I have

ImageButton musicGrid[][] = new ImageButton [8][8];

Then I have my nested for loops that basically create a string that will be in place of R.id.whatever. It's just that last line in my loops, that is supposed to do the assigning. What would the correct syntax for that be, or is this not even possible to do (and if so, how better would I handle a 64 button grid?). Thanks!

for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            String btnID = "R.id.";
            switch(i) {
            case 0: btnID.concat("one"); break;
            case 1: btnID.concat("two"); break;
            case 2: btnID.concat("three"); break;
            case 3: btnID.concat("four"); break;
            case 4: btnID.concat("five"); break;
            case 5: btnID.concat("six"); break;
            case 6: btnID.concat("seven"); break;
            case 7: btnID.concat("eight"); break;
            }
            switch(j) {
            case 0: btnID.concat("1"); break;
            case 1: btnID.concat("2"); break;
            case 2: btnID.concat("3"); break;
            case 3: btnID.concat("4"); break;
            case 4: btnID.concat("5"); break;
            case 5: btnID.concat("6"); break;
            case 6: btnID.concat("7"); break;
            case 7: btnID.concat("8"); break;
            }
            musicGrid[i][j] = (ImageButton) findViewById(btnID);
        }
    }
A: 

If you didn't already hardcode the buttons in the xml, I would have said to do it programmatically with a ViewInflater, but since you did here's the code:

String[] number_as_word = ["one", "two", "three", "four", "five", "six", "seven", "eight"];
for (int i = 0; i < 8; i++) {
  for (int j = 0; j < 8; j++) {
    musicGrid[i][j] = (ImageButton) findViewById("R.id." + number_as_word[i] + (j+1));
  }
}
AndrewKS
That is a much more concise way to do what I had, and I love it. The actual problem though, which I totally forgot to mention (my bad!) is that findViewByID says it wants an integer, not a String. So how do I get Java to evaluate that string as an ID? I am assuming I can't just cast it.
Nick
Yup, I forgot about that. See Cristian's answer.
AndrewKS
+2  A: 

I like AndrewKS' for, it's more elegant. Just keep in mind that findViewById receives an integer rather than a String. So you will have to do something like:

int resID = getResources().getIdentifier(btnID, "drawable", "com.your.package");
musicGrid[i][j] = (ImageButton) findViewById(resID);
Cristian
Oh, that looks like exactly what I need. I'll let you know if it works out. Thanks a ton.
Nick
A: 

Unless there's some specific need to do it as individual ImageButtons, you might be better off using a GridView.

Here is a tutorial using images in a GridView using an adapter.

kcoppock