Получение идентификатора программно сгенерированной сетки кнопок в Android - PullRequest
1 голос
/ 28 июня 2010

У меня есть запрос, аналогичный тому, который был размещен здесь . Я создаю сетку, состоящую из переменного количества кнопок, во время выполнения (в TableLayout), и хотел бы найти индекс нажатой кнопки. Фактические объекты Button в настоящее время хранятся в массиве, хотя я не уверен, действительно ли это необходимо. Я пытался написать ClickListener, используя что-то вроде:

public void onClick(View view) {

       Button clickedButton = (Button) view;
               int buttonID = clickedButton.getId();

но это всегда всегда возвращает -1. Можно ли получить идентификатор (или какую-либо другую ссылку на нажатую кнопку) без предварительного определения кнопок в xml?

Решение в другом посте описывает циклический просмотр всего массива кнопок и сравнение идентификаторов. Есть ли более элегантный способ сделать это?

Ответы [ 3 ]

1 голос
/ 28 июня 2010

Вы можете вручную установить идентификатор для динамически создаваемых виджетов с помощью этого метода .

0 голосов
/ 04 января 2015

На случай, если кому-то это нужно, я предпочитаю это делать.Слушатель также является классом, поэтому вы можете создавать для него переменные экземпляра.

new Listener(id) {

  private int id;

  public Listener(int id) {
    this.id = id;
  }

  private void onClick(View view) {        
    buttonID = id;
  }

}

Где buttID объявляется вне слушателя.Это решение можно улучшить, переместив слушателя за пределы класса в качестве отдельного класса, чтобы избежать утечек памяти.

Другой метод для обработки без утечек слушателей будет определять слушателя как вложенный класс путем объявления его public/private static class Listenerвнутри содержащего класса, но в этом случае int id будет перезаписываться каждый раз.

0 голосов
/ 28 июня 2010

Вам не нужны идентификаторы, если у вас есть ссылки.

    final Button b1 = new Button(this);
    final Button b2 = new Button(this);
    final Button b3 = new Button(this);
    Button[] buttons = new Button[] { b1, b2, b3 };
    OnClickListener listener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (v == b1) {
                // TODO
            } else if (v == b2) {
                // TODO
            } else if (v == b3) {
                // TODO
            }
        }
    };
    for (Button b : buttons) {
        b.setOnClickListener(listener);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...