Agent0013
Agent0013

Reputation: 3

I need to add onClickListener to a bunch of ImageButtons

I have created a bunch of ImageButtons programmatically while in a for loop. They have worked fine as the data displayed in a HorizontalScrollView. Now I need each one to go dim or bright when clicked. First click will setAlpha(45); second click will setAlpha(255);.

I don't think I fully understand how the Views and onClickListener works yet. It seems the onClick function examples I find take a View. How would that function know which button is clicked? Perhaps there is an easier way to do what I want?

Here are the ImageButtons.

TableRow tr0 = new TableRow(this);
tr0.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

for(int but=0; but<ClueList.size(); but++){
   ImageButton clueBut = new ImageButton(this);
      clueBut.setBackgroundResource(0);
      clueBut.setImageBitmap(ClueList.get(but).btmp);
      //clueBut.setOnClickListener(this);

      tr0.addView(clueBut);
}

Is there something I need to do to make the buttons identifiable? And how would that pass in through into the onClick function to be used?

-: Added Information :- I am starting to wonder if the problem isn't with the buttons, but with the way I built the screen. More information added.

The Game activity is the main game, which uses the PuzzleView for the upper part of the screen holding the game grid. The lower part is where the ImageButtons are and I built them in place in the Game class.

public class Game extends Activity{
   //various variables and stuff

   private PuzzleView puzzleView;    // The PuzzleView is from another .java file
                                     // public class PuzzleView extends View

   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);

      LinearLayout mainPanel = new LinearLayout(this);
      mainPanel.setOrientation(LinearLayout.VERTICLE);

      puzzleView = new PuzzleView(this);
      mainPanel.addView(puzzleView);

      HorizontalScrollView bottom = new HorizontalScrollView(this);
      mainPanel.addView(bottom);

      TableLayout clues = new TableLayout(this);
      bottom.addView(clues);

      TableRow tr0 = new TableRow(this);
      for(int but=0; but<ClueList.size(); but++){
        ImageButton clueBut = new ImageButton(this);
        clueBut.setImageBitmap(ClueList.get(but).btmp);

        tr0.addView(clueBut);
       }

When I try to add the ClickListener(this) I get errors about this not being able to be a Game. I have similar problems in the onClick(View v) function referencing the View. Are these problems because I am building the buttons in the Game Activity instead of a View class?

Thanks

Upvotes: 0

Views: 1228

Answers (3)

Manish Khot
Manish Khot

Reputation: 3037

To identify each view uniquely use the property

View. setId(int)

In your case the code would look something like this

for(int but=0; but<ClueList.size(); but++){
   ImageButton clueBut = new ImageButton(this);
      clueBut.setBackgroundResource(0);
      clueBut.setImageBitmap(ClueList.get(but).btmp);
      clueBut.setId(but);
      //clueBut.setOnClickListener(this);

      tr0.addView(clueBut);
}

Inside the onclick listener match the id of the view using findViewByID()

Upvotes: 0

Aleadam
Aleadam

Reputation: 40381

When you set up an OnClickListener and implement the onClick(View v) callback, it's the Dalvik VM the one that will call that method each time the View is clicked, and it will pass the View instance as a parameter. Thus, the code you write inside that method will be applied only to the View that received the click and not to any other View. Add something like this to your loop:

clueBut.setOnClickListener(new OnClickListener() {
  public void onClick (View v) {
    if (v.getAlpha() == 1f)
      v.setAlpha(0.2f);
    else
      v.setAlpha(1f);
  }
});

Upvotes: 4

J J
J J

Reputation: 1600

In the onClick event:

public void onClick(View currentView) 
{
    Button currentButton = (Button)CurrentView;
    //Do whatever you need with that button here.
}

Upvotes: 1

Related Questions