Search code examples
androidloopsfor-loopdrawableimagebutton

Android Studio: Iterate through images in drawable for onClick imageButton


I currently have 8 imageButtons set up with id's imageButton1 to imageButton8.

When i click on a particular button (imageButton2 for example) I want to loop through my images in the drawable folder named image1....image10, and set the image to the imageButton for each click.

I have looked at various for loops to solve this but there they have led nowhere. Here is a snippet of a for loop attempt:
UPDATED 26/4/16
SOLVED

//UPDATED 25/4/16
ImageButton btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8;
ImageButton[] btns;
int[] drawables = new int[]{R.drawable.image1,R.drawable.image2,R.drawable.image3,R.drawable.image4,R.drawable.image5,R.drawable.image6,R.drawable.image7,R.drawable.image8};


@Override
protected void onCreate(Bundle savedInstanceState) {  

    btn1 = (ImageButton) findViewById(R.id.imageButton1);
    btn2 = (ImageButton) findViewById(R.id.imageButton2);
    btn3 = (ImageButton) findViewById(R.id.imageButton3);
    btn4 = (ImageButton) findViewById(R.id.imageButton4);
    btn5 = (ImageButton) findViewById(R.id.imageButton5);
    btn6 = (ImageButton) findViewById(R.id.imageButton6);
    btn7 = (ImageButton) findViewById(R.id.imageButton7);
    btn8 = (ImageButton) findViewById(R.id.imageButton8);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
}


btns = new ImageButton[]{btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8};
}

int counter = 0;
        @Override
    public void onClick(View v)
        {

            counter ++;


            for (int i = 0; i < btns.length; i++)
            {


                if (v.getId() == btns[i].getId())
                {
                    if(counter ==8)
                    {
                        counter =0;
                    }

                        ((ImageButton)v).setImageResource(drawables[counter]);

                }

            }
}
}

UPDATED 26/4/16 SOLVED

Another attempt was to create a counter to store the number of clicks and set if statements to change the images according to each click.

The problem here was it creates a huge amount of code considering i have multiple buttons.

On top of that when i run this on two different buttons, once i tap on imageButton1 a few times, then imageButton2 a few times, imageButton1 doesn't respond anymore.

int counter =0;

        @Override
    public void onClick(View v)
        {
            counter++;


            switch(v.getId())
            {
                case R.id.imageButton1:
                    if(counter == 1){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image1);
                        break;

                    }else if (counter == 2){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image2);
                        break;

                    }else if (counter == 3){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image3);

                        break;

                    }else if (counter == 4){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image4);

                        break;
                    }else if (counter == 5){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image5);
                        break;

                    }else if (counter == 6){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image6);

                        break;

                    }else if (counter == 7){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image7);

                        break;
                    }else if (counter == 8){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image8);
                        break;

                    }else if (counter == 9){

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image9);

                        break;

                    }else if (counter == 10) {

                        ImageButton btn1 = (ImageButton) findViewById(R.id.imageButton1);
                        btn1.setImageResource(R.drawable.image10);
                        counter = 0;
                        break;
                    }
                    break;

I would appreciate any guidance, meanwhile if i solve this issue i will repost an Edit. Cheers


Solution

  • Just a suggestion.

    Maybe you could declare the buttons and image resources as arrays then loop through them.

    For example:

    public class Sample extends Activity {
    
      ImageButton btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8;
      ImageButton[] btns;
      int[] drawables = new int[]{R.drawable.imageButton1,R.drawable.imageButton2,R.drawable.imageButton3,R.drawable.imageButton4,R.drawable.imageButton5,R.drawable.imageButton6,R.drawable.imageButton7,R.drawable.imageButton8};
      int[] origDrawables = new int[]{R.drawable.imageOrigButton1,R.drawable.imageOrigButton2,R.drawable.imageOrigButton3,R.drawable.imageOrigButton4,R.drawable.imageOrigButton5,R.drawable.imageOrigButton6,R.drawable.imageOrigButton7,R.drawable.imageOrigButton8};
    
      @Override
      public void onCreate(Bundle saveInstanceState) {
        btn1 = (ImageButton) findViewById(R.id.imageButton1);
        btn2 = (ImageButton) findViewById(R.id.imageButton2);
        btn3 = (ImageButton) findViewById(R.id.imageButton3);
        btn4 = (ImageButton) findViewById(R.id.imageButton4);
        btn5 = (ImageButton) findViewById(R.id.imageButton5);
        btn6 = (ImageButton) findViewById(R.id.imageButton6);
        btn7 = (ImageButton) findViewById(R.id.imageButton7);
        btn8 = (ImageButton) findViewById(R.id.imageButton8);
    
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
        btn4.setOnClickListener(this);
        btn5.setOnClickListener(this);
        btn6.setOnClickListener(this);
        btn7.setOnClickListener(this);
        btn8.setOnClickListener(this);
    
        btns = new ImageButton[]{btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8};
      }
    
      @Override
      public void onClick(View v) {
        for (int i = 0; i < btns.length; i++) {
          if (v.getId == btns[i].getId) {
            ((ImageButton)v).setImageResource(drawables[i]);
          } else {
            ((ImageButton)v).setImageResource(origDrawables[i]);
          }
        }
      }
    
    }
    

    NOTE: Pardon any code/syntax errors as I did this using notepad.