Dick Lucas
Dick Lucas

Reputation: 12639

Edit text of several buttons using a for loop

I have 16 buttons, whose names are "button1", "button2", and so on. Is there a way I can iterate through them using a for loop, by somehow appending the number value upon each iteration? Something like this:

for(int i = 1; i<17; i++ ){
        Button b = (Button)findViewById(R.id.buttoni);

I know I can simply initialize each button in my onCreate() method, but I was just curious if I could do it in a way similar to my example code.

Thank you.

Upvotes: 2

Views: 516

Answers (2)

Alexis C.
Alexis C.

Reputation: 93842

You can use getIdentifier :

for(int i = 1; i<17; i++ ){        
     int buttonId = getResources().getIdentifier("button"+i, "id", getPackageName());
     Button b = (Button)findViewById(buttonId);
     //Your stuff with the button
}

Upvotes: 3

Mahdi-bagvand
Mahdi-bagvand

Reputation: 1407

You can create an array of Button's and use getIdentifier method that allows you to get an identifier by its name.

final int number = 17;
final Button[] buttons = new Button[number];
final Resources resources = getResources();

for (int i = 0; i < number; i++) {
    final String name = "btn" + (i + 1);
    final int id = resources.getIdentifier(name, "id", getPackageName());

    buttons[i] = (Button) findViewById(id);
}

In case someone is interested how to achive the same result using Java only

The solution above uses Android specific methods (such as getResources, getIdentifier) and can not be used in usual Java, but we can use a reflection and write a method that works like a getIdentifier:

public static int getIdByName(final String name) {
    try {
        final Field field = R.id.class.getDeclaredField(name);

        field.setAccessible(true);
        return field.getInt(null);
    } catch (Exception ignore) {
        return -1;
    }
}

And then:

final Button[] buttons = new Button[17];

for (int i = 0; i < buttons.length; i++) {
    buttons[i] = (Button) findViewById(getIdByName("btn" + (i + 1)));
}

NOTE:

Instead of optimizing this kind of code you should rethink your layout. If you have 17 buttons on the screen, a ListView is probably the better solution. You can access the items via index and handle onClick events just like with the buttons.

Upvotes: 1

Related Questions