Android - Как установить именованный метод в button.setOnClickListener()

Большинство образцов, которые я вижу, похоже, используют анонимный метод в вызове типа button.setOnClickListener(). Вместо этого я хотел бы передать метод, определенный в классе Activity, в котором я работаю. Что эквивалент Java/Android следующего проводника обработчика событий в С#?

Button myButton = new Button();
myButton.Click += this.OnMyButtonClick;

Где:

private void OnMyButtonClick(object sender, EventArgs ea)
{
}

По сути, я хотел бы повторно использовать не анонимный метод для обработки события click из нескольких кнопок.

Ответ 1

Ответ Роман Нурик почти прав. View.OnClickListener() на самом деле является интерфейсом. Поэтому, если ваша активность реализует OnClickListener, вы можете установить ее как обработчик нажатия кнопки.

public class Main extends Activity implements OnClickListener {

      public void onCreate() {
           button.setOnClickListener(this);
           button2.setOnClickListener(this);
      }

      public void onClick(View v) {
           //Handle based on which view was clicked.
      }
}

Нет делегатов, как в .Net, поэтому вы застряли, используя функцию, основанную на интерфейсе. В .Net вы можете указать другую функцию с помощью делегатов.

Ответ 2

Аргумент View.setOnClickListener должен быть экземпляром класса View.OnClickListener (внутренний класс класса View). Для вашего варианта использования вы можете сохранить экземпляр этого внутреннего класса в переменной и затем передайте это так:

View.OnClickListener clickListener = new OnClickListener() {
    public void onClick(View v) {
        // do something here
    }
};

myButton.setOnClickListener(clickListener);
myButton2.setOnClickListener(clickListener);

Если вам нужен этот прослушиватель для нескольких подпрограмм/методов, вы можете сохранить его как переменную-член в своем классе активности.

Ответ 3

Подпись метода должна быть такой...

public void onMyButtonClick(View view){

}

Если вы не используете динамические кнопки, вы можете установить событие onClick из конструктора в "onMyButtonClick". Это как я делаю это для статических кнопок на экране. Мне было легче связать его с С#.