Android: Using findViewById() with a string / in a loop

AndroidButtonClicklistener

Android Problem Overview


I'm making an android application, where there is a view composed of hundreds of buttons, each with a specific callback. Now, I'd like to set these callbacks using a loop, instead of having to write hundreds of lines of code (for each one of the buttons).

My question is: How can I use findViewById without statically having to type in each button id? Here is what I would like to do:

    for(int i=0; i<some_value; i++) {
	   for(int j=0; j<some_other_value; j++) {
		String buttonID = "btn" + i + "-" + j;
		buttons[i][j] = ((Button) findViewById(R.id.buttonID));
		buttons[i][j].setOnClickListener(this);
	   }
	}

Thanks in advance!

Android Solutions


Solution 1 - Android

You should use getIdentifier()

for(int i=0; i<some_value; i++) {
   for(int j=0; j<some_other_value; j++) {
    String buttonID = "btn" + i + "-" + j;
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
    buttons[i][j] = ((Button) findViewById(resID));
    buttons[i][j].setOnClickListener(this);
   }
}

Solution 2 - Android

You can try making an int[] that holds all of your button IDs, and then iterate over that:

int[] buttonIDs = new int[] {R.id.button1ID, R.id.button2ID, R.id.button3ID, ... }

for(int i=0; i<buttonIDs.length; i++) {
    Button b = (Button) findViewById(buttonIDs[i]);
    b.setOnClickListener(this);
}

Solution 3 - Android

Solution 4 - Android

you can Use tag if you want to access.

in onClick

int i=Integer.parseInt(v.getTag);

But you cant access that button like this.

simply create button programatically

by Button b=new Button(this);

Solution 5 - Android

create Custom Button in java code rather in Xml as i shown below

Button bs_text[]= new Button[some_value];

	for(int z=0;z<some_value;z++)
		{
			try
			{
				
			bs_text[z]   =  (Button) new Button(this);
			
			}
			catch(ArrayIndexOutOfBoundsException e)
			{
				Log.d("ArrayIndexOutOfBoundsException",e.toString());
			}
		}

Solution 6 - Android

If your top level view only has those button views as children, you could do

for (int i = 0 ; i < yourView.getChildCount(); i++) {
    Button b = (Button) yourView.getChildAt(i);
    b.setOnClickListener(xxxx);
}

If there are more views present you'd need to check if the selected one is one of your buttons.

Solution 7 - Android

If for some reason you can't use the getIdentifier() function and/or you know the possible id's beforehand, you could use a switch.

int id = 0;

switch(name) {
    case "x":
        id = R.id.x;
        break;
    etc.etc.
}

String value = findViewById(id);

Solution 8 - Android

To put it simply, here's a function for it

public View findViewByArrayName (String name, int i) {
        buttonID = name + Integer.toString(i);
        resID = getResources().getIdentifier(buttonID, "id", getPackageName());
        return findViewById(resID);
    }

Also unlike Python, Java is a compiled language, so it probably makes sense that there aren't any chances for dynamic variable names. Unless achieved through a certain approach like this one.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser573536View Question on Stackoverflow
Solution 1 - AndroidWarrenFaithView Answer on Stackoverflow
Solution 2 - AndroidRick BarkhouseView Answer on Stackoverflow
Solution 3 - AndroidCristianView Answer on Stackoverflow
Solution 4 - AndroidGanapathy CView Answer on Stackoverflow
Solution 5 - AndroidSankar Ganesh PMPView Answer on Stackoverflow
Solution 6 - AndroidHeiko RuppView Answer on Stackoverflow
Solution 7 - AndroidB.CakirView Answer on Stackoverflow
Solution 8 - AndroidMihkunoView Answer on Stackoverflow