9

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);
        }
    }
Nick
  • 6,900
  • 5
  • 45
  • 66
  • 2
    Adding 64 buttons to an XML file is probably a bad approach. With layouts like that why not just create a view in Java and do it all programatically? – Falmarri Oct 14 '10 at 20:03

3 Answers3

8

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
  • 198,401
  • 62
  • 356
  • 264
  • Oh, that looks like exactly what I need. I'll let you know if it works out. Thanks a ton. – Nick Oct 14 '10 at 20:08
2

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
  • 3,603
  • 2
  • 24
  • 33
  • 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 Oct 14 '10 at 20:06
  • Yup, I forgot about that. See Cristian's answer. – AndrewKS Oct 14 '10 at 20:08
0

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.

Kevin Coppock
  • 133,643
  • 45
  • 263
  • 274