Carla Dessi
Carla Dessi

Reputation: 9666

Java for android, code repetition

I currently have this bit of code, but I need to repeat it for red green and blue, is there a way I can do it without copying and pasting the code 3 times??

    yellow.setOnClickListener(new View.OnClickListener() {    
        public void onClick (View v)   {   

            switch (buttonCount) {
            case 1:  
                empty1.setImageResource(R.drawable.yellow);
                buttonCount++;
                guess1= Colour.YELLOW;
                break;
            case 2:  
                empty2.setImageResource(R.drawable.yellow);
                buttonCount++;
                guess2=Colour.YELLOW;
                break;
            case 3:  
                empty3.setImageResource(R.drawable.yellow);
                buttonCount++;
                guess3=Colour.YELLOW;
                break;
            case 4:  
                empty4.setImageResource(R.drawable.yellow);
                buttonCount++;
                guess4=Colour.YELLOW;
                break;
            case 5:  
                empty5.setImageResource(R.drawable.yellow);
                buttonCount++;
                guess5=Colour.YELLOW;
                break;

            }
        }
    });

Upvotes: 1

Views: 134

Answers (3)

Maggie
Maggie

Reputation: 8081

You CAN use reflections to do this, but you should be aware of the dangers the reflections bring. Anyway, your code would look like this:

  Button button;
  Class c = Class.forName("your.package.name.R$id");
  Field field = c.getDeclaredField("empty"+buttonCount);
  button = (Button) findViewById(field.getInt(null));
  button.setImageResource(R.drawable.yellow);

Surround it with all the exception necessary.

EDIT: In line: c.getDeclaredField("empty"+buttonCount); you have to use the actual id by which they were declared in your layout xml. I assued it was "empty1", "empty2"... "empty5"

Upvotes: 0

nachokk
nachokk

Reputation: 14413

I don't know much android but you can define a private a class

private class MyClickListener implements View.OnClickListener{

   private final String colour;
   private final String imageResource;

    public MyClickListener(String colour, String imageResource){
      this.colour = colour;
      this imageResource = imageResource;
    }   

   @Override
   public void onClick (View v)   {   

            switch (buttonCount) {
            case 1:  
                empty1.setImageResource(imageResource);
                buttonCount++;
                guess1= colour;
                break;
            case 2:  
                empty2.setImageResource(imageResource);
                buttonCount++;
                guess2=colour;
                break;
            case 3:  
                empty3.setImageResource(imageResource);
                buttonCount++;
                guess3=colour;
                break;
            case 4:  
                empty4.setImageResource(imageResource);
                buttonCount++;
                guess4=colour;
                break;
            case 5:  
                empty5.setImageResource(imageResource);
                buttonCount++;
                guess5=colour;
                break;

            }
        }
}

And in your client code

yellow.setOnClickListener(new View.OnClickListener(new MyClickListener(Colour.YELLOW));

Also instead of using a lot of variables of the same type as empty1 empty2 you can put them in a collection like a List preferable an ArrayList, the same with guess1 guessN then in your code

            list.get(buttonCount).setImageResource(imageResource);
            list.set(buttonCount,colour);
            buttonCount++;

Upvotes: 1

Sean
Sean

Reputation: 179

You can easily abstract this out by checking which button is clicked and then set the appropriate image from that, heres a quick examle (though likely not working code depending on your id's):

public void onClick (View v)   {   
    int drawable = 0;
    Colour guess = null;
    switch (v.getId())
    {
        case R.id.yellowButton:
            drawable = drawable;
            guess = Colour.YELLOW;
            break;
        case R.id.blueButton:
            drawable = R.drawable.blue;
            guess = Colour.BLUE
            break;
        case R.id.redButton:
            drawable = R.drawable.red;
            guess = Colour.RED
            break;
        case R.id.greenButton:
            drawable = R.drawable.green;
            guess = Colour.GREEN
            break;
    }
    switch (buttonCount) 
    {
    case 1:  
        empty1.setImageResource(drawable);
        buttonCount++;
        guess1= guess;
        break;
    case 2:  
        empty2.setImageResource(drawable);
        buttonCount++;
        guess2=guess;
        break;
    case 3:  
        empty3.setImageResource(drawable);
        buttonCount++;
        guess3=guess;
        break;
    case 4:  
        empty4.setImageResource(drawable);
        buttonCount++;
        guess4=guess;
        break;
    case 5:  
        empty5.setImageResource(drawable);
        buttonCount++;
        guess5=guess;
        break;

    }
}

then you can simply just register the buttons to this onClick method (either through xml or programmatically)

Upvotes: 1

Related Questions