Мне нужно добавить onClickListener в кучу ImageButtons

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

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

Вот 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, которую нужно использовать?

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

Активность Game — это основная игра, которая использует 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. Это проблемы из-за того, что я создаю кнопки в Game Activity вместо класса View?

Спасибо


person Agent0013    schedule 17.06.2011    source источник


Ответы (3)


Когда вы настраиваете 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);
  }
});
person Aleadam    schedule 17.06.2011
comment
Я добавил дополнительную информацию выше. Эти предложения похожи на то, что я нашел в Интернете, но я получаю ошибки, связанные с использованием View в onClick или использованием this в onClickListener. Может я неправильно строю экран? - person Agent0013; 17.06.2011
comment
Ваша активность не реализует интерфейс OnClickListener, поэтому вы не можете использовать clueBut.setOnClickListener(this);. Либо реализуйте его (public class Game extends Activity implements OnClickListener {), либо используйте фрагмент, который я разместил вместо этого. Если вы получите какую-либо ошибку, пожалуйста, опубликуйте ее, чтобы я мог понять, в чем ваша конкретная проблема. - person Aleadam; 17.06.2011
comment
Я попытался добавить implements OnClickListener в класс Game и получил ту же ошибку. The method setOnClickListener(View.OnClickListener) in the type View is not applicable for the arguments (new DialogInterface.OnClickListener(){}) Кажется, всплывающее диалоговое окно, которое появляется после завершения игры, мешает тому, что я пытаюсь сделать с помощью этих кнопок. Что было бы самым простым способом исправить это? Я начал пытаться переместить кнопки прокрутки в другой класс, как вызывается PuzzleView из другого класса, но у него возникли проблемы с доступом к связанному списку подсказок. - person Agent0013; 18.06.2011
comment
вместо этого вам нужно реализовать View.OnClickListener. Просто используйте полное имя, чтобы отличить его от другого импортированного вами OnClickListener: public class Game extends Activity implements View.OnClickListener { - person Aleadam; 18.06.2011
comment
Либо так, либо используйте clueBut.setOnClickListener(new View.OnClickListener() { - person Aleadam; 18.06.2011
comment
В итоге я решил свою проблему, переместив диалоговое окно завершения в отдельный java-файл, аналогично тому, как было сделано всплывающее окно с клавиатурой из примера. Спасибо за помощь. - person Agent0013; 19.06.2011

В событии onClick:

public void onClick(View currentView) 
{
    Button currentButton = (Button)CurrentView;
    //Do whatever you need with that button here.
}
person J J    schedule 17.06.2011
comment
Это кажется простым и похоже на то, что я нашел в Интернете. Я думаю, что могу неправильно строить экран, так как View currentView выдает ошибки. - person Agent0013; 17.06.2011

Чтобы однозначно идентифицировать каждое представление, используйте свойство

Вид. setId (целое число)

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

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()

person Manish Khot    schedule 17.06.2011
comment
Я попытался добавить setID (но) в цикл. У меня все еще есть ошибки с setOnClickListener (это). Возможно, я что-то делаю не так с макетом экрана. Я добавил больше информации выше. - person Agent0013; 17.06.2011
comment
Хорошая точка зрения. Он есть, я просто пропустил, чтобы положить его здесь. После цикла for, создающего кнопки, есть clues.addView(tr0,new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));, а затем setContentView(mainPanel); - person Agent0013; 17.06.2011
comment
Извините, что задаю много вопросов, чем разрешаю сомнения. Но в данном коде TableLayout добавляется в HorizontalScrollView, но строка таблицы не добавляется в TableLayout. Это иссеу? - person Manish Khot; 17.06.2011
comment
Возможно, это проблема. У меня есть линия clues.addView(tr0,new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));. Поскольку я новичок в Android, я думал, что это будет делать. Мне удалось получить секцию горизонтальной прокрутки с помощью кнопок изображения. На самом деле у меня есть три ряда кнопок, но я вырезал некоторые из них, чтобы упростить задачу. Как вы думаете, я неправильно добавляю строку таблицы в макет таблицы? - person Agent0013; 17.06.2011