В чем разница между этими двумя способами использования кнопок и OnClickListener?

1

У меня довольно дерьмовая книга, поэтому я не уверен в их аргументах в пользу использования любой формы.

Первый способ, которым это будет происходить, будет таким

 Button button = (Button) findViewById(R.id.btnButton)

 button.setOnClickListener(new OnClickListener() {
//code code code }

Затем наша книга хочет использовать глобальные переменные вместо локальных, поэтому она случайно начинает использовать другой способ, чтобы идти о вещах

Button btButton;
//Done as Global Variable.

btButton = (Button) findViewById(R.id.btnButton);
btButton.setOnClickListener(bButton);


Button.OnClickListener bButton = new Button.OnClickListener(){
//code }

Это похоже на то, что моя книга ужасна и одна причина, по которой я не буду покупать следующий взнос. Я ненавижу, когда он просто меняет то, как он делает вещи без какой-либо реальной причины. Так может ли кто-нибудь действительно сказать мне разницу здесь? Благодарю.

Теги:
onclicklistener

6 ответов

3
Лучший ответ

Как все говорят, нет difference--, но никто не объяснил почему.

Button продолжит View.

Когда вы используете onClickListener, вы используете тот, который определен в View. Почти всегда этот work-- не будет с Dialogs, а может быть, и с некоторыми другими классами.

Если вы явно говорите Button.onClickListener, вы ссылаетесь на onClickListener определенный в классе Button, и поскольку Button extends View, это то же самое, что и с использованием общего onClickListener.

Существует также внутренний анонимный vs явный, но это скорее предпочтение. Вы получите лучшую производительность, используя статический onClickListener, чем во внутреннем анонимном, просто потому, что вам нужно меньше сбора мусора, но вы его не заметите, если у вас нет 30 анонимных внутренних слушателей.

  • 0
    Вау, спасибо. Да, я понял, что мне действительно нужно лучше познакомиться с Java, чем я, и это, вероятно, одна из тех проблем, которые были бы понятны, как вода, если бы у меня было лучшее понимание.
4

Оба эти же. Первый использует анонимный внутренний класс, а secon on создает объект listner и передает его методу.

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

2

Технически, когда вы пишете:

button.setOnClickListener(new OnClickListener() { ... });

Во время компиляции он будет преобразован в следующий код:

Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... };
button.setOnClickListener(anonymous_listener);

Второй пример, который вы указали, плох. Он хранит бесполезную ссылку на OnClickListener которая никогда не будет использоваться где-то еще, чем в вашем onCreate(). Это только 8 байт, потерянных или так, но все же бесполезно и должно быть определено как локальная переменная.

2
button.setOnClickListener(new OnClickListener() 

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

Button.OnClickListener bButton = new Button.OnClickListener(){

Причина использования Button.OnClickListener заключается в том, что OnClickListener находится в классе просмотра. и Button Class наследует его от представления. Поэтому, чтобы избежать импорта, мы использовали непосредственно Button.OnClickListener.

2

Тебе не о чем беспокоиться. Они оба делают то же самое. В первом примере вы создаете экземпляр OnClickListener, когда вы устанавливаете его на кнопку.

Во втором случае, onClickListener уже был создан заранее, и вы передаете ссылку на него.

Различные люди предпочитают делать это по-разному, и они поддаются разной функциональности.

Очевидно, установив его равным bButton во втором примере, вы можете манипулировать им позже или использовать его в других прослушивателях кнопок, в то время как у вас нет копии первой, с которой нужно сделать это.

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

Надеюсь, что сейчас кажется немного яснее

  • 0
    А, ну ладно. Видите, я наполовину порядочен в этом, когда это объясняется, но это заставляет меня подниматься вверх по стене, когда это похоже на: ЭЙ, я собираюсь начать делать это таким образом и не давать никаких объяснений, почему этот способ может быть использован.
2

Между двумя приведенными вами примерами нет никакой реальной разницы. Ваша книга, вероятно, не охватывала это, потому что это скорее вопрос Java, чем Android. Первый из них просто динамически объявляет ваш экземпляр OnClickListener, где на втором вы объявили его stataically, а затем ссылались на него. При исполнении они будут вести себя точно так же.

Вы можете использовать второй пример, если, например, у вас более одной кнопки. Вы можете передать свой OnClickListener каждому, а затем обработать какую кнопку нажата изнутри OnClickListener вместо того, чтобы иметь отдельную OnClickListener для каждой кнопки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню