Android OnClickListener - определяет кнопку

У меня есть действие:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler);
    b2.setOnClickListener(myhandler);
    ...
  }
  View.OnClickListener myhandler = new View.OnClickListener() {
    public void onClick(View v) {
      // MY QUESTION STARTS HERE!!!
      // IF b1 do this
      // IF b2 do this
      // MY QUESTION ENDS HERE!!!
    }
  }
}

Как я проверяю, какая кнопка была нажата?

134
задан Dharman 5 October 2019 в 15:52
поделиться

3 ответа

Вы узнаете, как это легко сделать:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler1);
    b2.setOnClickListener(myhandler2);
    ...
  }
  View.OnClickListener myhandler1 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 1st button
    }
  };
  View.OnClickListener myhandler2 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 2nd button
    }
  };
}

Или, если вы работаете только с одним прослушивателем кликов, вы можете сделать:

View.OnClickListener myOnlyhandler = new View.OnClickListener() {
  public void onClick(View v) {
      switch(v.getId()) {
        case R.id.b1:
          // it was the first button
          break;
        case R.id.b2:
          // it was the second button
          break;
      }
  }
}

Хотя я не рекомендую делать это так так как вам нужно будет добавить if для каждой используемой кнопки. Это сложно поддерживать.

197
ответ дан 23 November 2019 в 23:51
поделиться

В дополнение к ответу Кристиана С (извините, у меня нет возможности комментировать), если вы сделаете один обработчик для обеих кнопок, вы можете напрямую сравнить v с b1 и b2, или если вы хотите сравнить по идентификатору, вам не нужно приводить v к кнопке (View также имеет метод getId ()), и таким образом не нужно беспокоиться об исключении приведения.

4
ответ дан 23 November 2019 в 23:51
поделиться

Лучше всего переключить -ing между v.getId (). Наличие отдельного анонимного OnClickListener для каждой кнопки занимает больше памяти. Преобразование просмотра в кнопку не требуется. Использование if-else при возможности переключения медленнее и труднее для чтения. В исходниках Android вы часто можете заметить сравнение ссылок с помощью if-else:

if (b1 == v) {
 // ...
} else if (b2 == v) {

Я не знаю точно, почему они выбрали этот путь, но он тоже работает.

9
ответ дан 23 November 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: