Мне нужно добавить onClickListener в кучу ImageButtons - PullRequest
0 голосов
/ 17 июня 2011

Я создал группу ImageButtons программно в цикле for.Они отлично работали, так как данные отображались в HorizontalScrollView.Теперь мне нужно, чтобы каждый щелкнул тусклым или ярким.Первый щелчок установит Альфа (45);второй щелчок установит Alpha (255);.

Я не думаю, что полностью понимаю, как работает Views и onClickListener.Кажется, onClick примеры функций, которые я нахожу, берут вид.Как эта функция узнает, какая кнопка нажата?Возможно, есть более простой способ сделать то, что я хочу?

Вот эти 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);
}

Что мне нужно сделать, чтобы сделать кнопки узнаваемыми?И как это будет проходить в используемую функцию onClick?

-: Дополнительная информация: - Я начинаю задумываться, не проблема ли с кнопками, а с тем, как я построил экран,Добавлена ​​дополнительная информация.

Игра - это основная игра, которая использует PuzzleView для верхней части экрана, содержащей игровую сетку.В нижней части находятся кнопки ImageButton, и я построил их на месте в классе Game.

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);
       }

Когда я пытаюсь добавить ClickListener (это), я получаю ошибки о том, что this не может бытьGame.У меня похожие проблемы в функции onClick(View v), ссылающейся на View.Это проблемы, потому что я строю кнопки в игровом действии вместо класса View?

Спасибо

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Когда вы устанавливаете OnClickListener и реализуете обратный вызов onClick(View v), именно виртуальная машина Dalvik будет вызывать этот метод каждый раз при щелчке по представлению, и он будет передавать экземпляр представления в качестве параметра.Таким образом, код, который вы пишете внутри этого метода, будет применяться только к представлению, которое получило щелчок, а не к любому другому представлению.Добавьте что-то вроде этого в свой цикл:

clueBut.setOnClickListener(new OnClickListener() {
  public void onClick (View v) {
    if (v.getAlpha() == 1f)
      v.setAlpha(0.2f);
    else
      v.setAlpha(1f);
  }
});
1 голос
/ 17 июня 2011

В событии onClick:

public void onClick(View currentView) 
{
    Button currentButton = (Button)CurrentView;
    //Do whatever you need with that button here.
}
0 голосов
/ 17 июня 2011

Для идентификации каждого вида уникально используйте свойство

вид. SETID (INT)

В вашем случае код будет выглядеть примерно так

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);
}

Внутри слушателя onclick сопоставьте идентификатор представления, используя findViewByID()

...