Який правильний спосіб реалізувати інтерфейс OnClickListener для багатьох кнопок


10

Моя активність Android містить кілька кнопок, для яких потрібен OnClickListener. Я бачив безліч різних способів зробити це, наприклад:

  • Реалізація інтерфейсу в класі активності
  • Створення окремого класу, який реалізує інтерфейс
  • Визначення анонімного внутрішнього класу для кожної кнопки.

Я бачив багато прикладів кожного підходу. Однак мені не зрозуміло, чому один підхід буде використаний замість іншого. Чи стилістичні відмінності між цими підходами чи є причини, які покращують один підхід?

Відповіді:


6

Як і у багатьох випадках, правильний підхід залежить від того, що ви намагаєтесь зробити для конкретної кнопки та що ще ви робите з діяльністю.

Клас діяльності реалізує інтерфейс :
Це хороший варіант, коли у вас є лише один тип завдань, який потрібно виконати, коли цей слухач викликається. Прикладом цього може бути проста форма з кількістю полів та кнопкою збереження. Я вважаю за краще, щоб мій слухач події не перевіряв джерело події, щоб вирішити, що насправді потрібно зробити. Я знаю, що деякі можуть сказати, що це річ у стилі, але я вважаю, що не вимагаючи від слухача цього перевірки, полегшується виконання коду, оскільки ви точно знатимете, що викликається для кожної події.

Інший інтерфейс реалізує клас :
Як я вже говорив вище, я вважаю за краще цей варіант, коли у мене є кілька елементів, які можуть викликати одну і ту ж подію. Розширюючи вищенаведений приклад, можна додати чітку кнопку, яка також потребує прослуховувача кліків. Створіть одного слухача, який попередньо виконує дії збереження, і того, хто попередньо виконує чіткі дії. Кожен слухач додається лише до компонентів, які вироблятимуть цю дію.

Ця реалізація має додаткову перевагу, яку ви можете скористатись, якщо піклуєтеся. Перевага полягає в тому, що вона не дозволяє іншим класам викликати подію всередині вашого класу активності. Оскільки метод інтерфейсу повинен бути загальнодоступним, будь-який, хто має посилання на клас, може запустити подію. Якщо ви хочете чітко контролювати, хто може робити те, що в програмі, окремий клас не дозволяє комусь із посиланням на діяльність викликати очищення або збереження вашої форми (або потенційно може порушити код, якщо слухач використовує джерело, але робить не обробляти погане введення).

Анонімний внутрішній клас реалізує інтерфейс :
Це дійсно просто специфічний спосіб побудови другого варіанту використання іншого класу як реалізації. Цей параметр може ще більше обмежити, хто має доступ для запуску події, оскільки ніхто інший не може створити екземпляр класу. Однак я думаю, що більш важливим фактором між цими двома варіантами є те, наскільки робиться робота. Очищення кількох текстових полів - це проста та прямолінійна операція. Однак процес збереження файлу for може включати в себе ряд завдань: ви перевіряєте вхід (що вам слід зробити), записуєте в базу даних для зберігання значень і запускаєте деяку дію після збереження. У цьому випадку створення окремого класу з власним файлом забезпечить чіткіший поділ між формою введення та обробкою даних. Це, в свою чергу, зберігає код форми замість більшого файлу з кількома внутрішніми класами, вкладеними всередині.


Вау, дякую за вашу відповідь. З точки зору накладних витрат, чи дорожче створити кілька класів слухачів?
слайтон

@slayton: Витрати завжди будуть незалежно від того, чим займаєтесь. Питання повинно бути "Чи важлива для вас різниця?" Важливо створити більше об'єктів, але час виконання буде довшим, якщо слухачеві доведеться переглядати список джерел, щоб вирішити, що насправді робити. Якщо використання пам'яті та продуктивність для вас важливі, вам слід профайлювати код і вирішити, що найкраще виходячи з ваших вимог. Однак я б сумнівався, що це буде шийка пляшки вашого коду. Поки не буде показано інше, прийміть ваші рішення, зробіть код чіткішим та краще організованим.
unholysampler

3

Четвертий спосіб - встановити атрибут onClick у макеті:

<Button android:onClick="clickHandlerForButtonX" />

який має відповідний метод у діяльності:

public void clickHandlerForButtonX(View v) {
    //Handle Button X here
}

Цікаво, я не знав, що ти можеш це зробити. Хоча це, здається, є специфічним для Android механізмом роботи з натисканням кнопки.
слайтон

Зазвичай я йду з інтерфейсом "Клас діяльності реалізує інтерфейс", хоча - таким чином, у вас є всі речі, пов'язані з клацанням, в одному місці.
orjan

цей конкретний метод не працює з фрагментами.
Рахул Тіварі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.