Я понимаю, что подобный вопрос задавался раньше, но это другое. Я новичок в разработке приложений для Android, и у меня есть три вопроса относительно разницы между android:onclick=""
атрибутом XML и setOnClickListener
методом.
В чем разница между ними? Обнаружена ли разница между двумя реализациями во время компиляции или выполнения или во время обоих?
Какие варианты использования подходят для какой реализации?
Какая разница (а) в выборе реализации при использовании фрагментов в Android?
onclick
как вам нужно убедиться, что каждый класс реализует этот метод. Предполагается, что вы используете макет более одного раза. Однако, если бы у вас был интерфейс java, чтобы гарантировать, что метод присутствует во всех классах, которые его реализуют, вам не о чем беспокоиться.android:onclick
когда это удобно, но я знаю, что иногда это вызывает проблемы, и я их тоже не могу вспомнить :)Ответы:
Разница между OnClickListener и OnClick:
Оба функционируют одинаково, только один устанавливается через Java-код, а другой через XML-код.
Реализация кода setOnClickListener:
Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something very interesting }
Реализация XML:
<?xml version="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements -->
Производительность:
Оба одинаковы по производительности. При компиляции XML предварительно разбирается в двоичный код. поэтому в Xml нет лишних затрат.
Ограничение:
android: onClick предназначен для API уровня 4 и выше, поэтому, если вы нацеливаетесь на <1.6, вы не можете его использовать.
источник
Я шокирован, что никто не говорил об этом, но будьте осторожны, хотя
android:onClick
XML кажется удобным способом обработки щелчков,setOnClickListener
реализация делает что-то дополнительное, чем добавлениеonClickListener
. В самом деле, он присвоил свойству представленияclickable
значение true.Хотя это может не быть проблемой для большинства реализаций Android, согласно конструктору телефона, button всегда по умолчанию имеет значение clickable = true, но другие конструкторы на некоторых моделях телефона могут иметь значение по умолчанию clickable = false в представлениях без кнопок.
Таким образом, установки XML недостаточно, вам нужно все время думать, чтобы добавить
android:clickable="true"
не кнопку, и если у вас есть устройство, на котором по умолчанию используется clickable = true, и вы даже однажды забыли поставить этот атрибут XML, вы не заметите проблема во время выполнения, но вы получите обратную связь на рынке, когда она окажется в руках ваших клиентов!Кроме того, мы никогда не можем быть уверены в том, как proguard будет скрывать и переименовывать атрибуты XML и метод класса, поэтому не на 100% безопасно, что у них никогда не будет ошибки в один прекрасный день.
Так что, если вы никогда не хотите иметь проблемы и никогда не думаете об этом, лучше использовать
setOnClickListener
или библиотеки, такие как ButterKnife с аннотациями.@OnClick(R.id.button)
источник
android:onClick
?Просто:
Если у вас есть
android:onClick = "someMethod"
в xml , он ищетpublic void someMethod
в вашем классе Activity.OnClickListener
вызывается прямо из вашей деятельности и привязан к какой-то конкретнойView
. Например,someButton.setOnClickListener
в приведенном ниже коде сказано, что нужно делать приsomeButton
нажатии.Надеюсь, это поможет :)
источник
Как было сказано ранее: они оба являются способом добавления логики в ответ на событие, в данном случае событие «щелчок».
Я бы разделил логику и представление, как мы это делаем в мире HTML / JavaScript: оставьте XML для представления и добавьте слушателей событий с помощью кода.
источник
Если у вас есть несколько кнопок, использующих только один метод, я предлагаю сделать это в java. Но если у вас есть кнопка с одним конкретным методом, лучше использовать onClick в XML.
источник
Удобнее всегда использовать атрибут android: onClick, если у вас нет веской причины не делать этого, например, если вы создаете экземпляр Button во время выполнения или вам нужно объявить поведение щелчка в подклассе Fragment.
источник
Есть несколько причин, по которым вы можете захотеть программно установить
OnClickListener
. Во-первых, если вы когда-нибудь захотите изменить поведение своей кнопки во время работы приложения. Вы можете полностью указать кнопку на другой метод или просто отключить кнопку, установив,OnClickListener
что ничего не делает.Когда вы определяете прослушиватель с помощью
onClick
атрибута, представление ищет метод с таким именем только в своей активности узла. Программная установкаOnClickListener
позволяет вам управлять поведением кнопки откуда-нибудь, кроме активности хоста. Это станет очень актуальным, когда мы будем использоватьFragments
, которые в основном представляют собой мини-действия, позволяющие создавать многократно используемые коллекции представлений с их собственным жизненным циклом, которые затем можно объединить в действия. Фрагменты всегда необходимо использоватьOnClickListeners
для управления своими кнопками, поскольку они не являются действиями и не будут выполняться поиском слушателей, определенных в onClick.источник
Думаю, главное различие между ними:
OnClick: при нажатии на кнопку пальцем.
OnClickListner: это может быть более широкий выбор, который может быть реализован в различных кодах.
Например, когда вы набираете url «ymail.com», yahoo находит ваше имя пользователя и пароль в вашем браузере и активирует кнопку состояния щелчка, чтобы открыть вашу почту. Это действие должно быть реализовано только в onClickListener.
Это моя идея!
источник