Android onClick в XML против OnClickListener
Я понимаю, что раньше задавался аналогичный вопрос, но это другое. Я новичок в разработке приложений для Android, и у меня есть три вопроса относительно разницы между атрибутом android:onclick=""
XML и setOnClickListener
.
-
В чем разница между этими двумя? Является ли разница между двумя реализациями, найденными во время компиляции или времени выполнения или оба?
-
Какие варианты использования благоприятны для реализации?
-
Какая разница делает использование фрагментов в Android в выборе реализации?
Ответы
Ответ 1
Разница между OnClickListener и OnClick:
- OnClickListener - это интерфейс, который вам нужно реализовать, и его можно установить
к представлению в Java-коде.
- OnClickListener - это то, что ждет кого-то
на самом деле нажмите, onclick определяет, что происходит, когда кто-то
щелчки.
- В последнее время андроид добавил атрибут xml в представления под названием android: onclick,
которые могут использоваться для обработки кликов непосредственно в активности вида
без необходимости реализовывать какой-либо интерфейс.
- Вы можете легко поменять одну реализацию прослушивателя на другую, если вам нужно.
- OnClickListener позволяет вам отделить действие/поведение события click от представления, запускающего событие. Хотя для простых случаев это не так уж и важно, для комплексной обработки событий это может означать более читабельность и удобство обслуживания кода.
- Так как OnClickListener является интерфейсом, класс, который его реализует, обладает гибкостью при определении переменных экземпляра и методов, необходимых для обработки события. Опять же, это не имеет большого значения в простых случаях, но для сложных случаев мы не хотим, чтобы мы смешали переменные/методы, связанные с обработкой событий, с кодом представления, который запускает событие.
- OnClick с привязкой к функции в XML Layout является связующим звеном между onClick и функцией, которую он будет вызывать. Функция должна иметь один аргумент (вид), чтобы функция 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, то вы не можете его использовать.
Ответ 2
Просто:
Если у вас android:onClick = "someMethod"
в xml, он ищет public void someMethod
в вашем классе Activity. OnClickListener
называется правой из вашей деятельности, и он связан с определенным View
. Например, someButton.setOnClickListener
и в приведенном ниже коде сказано, что нужно делать при нажатии someButton
.
Надеюсь, это поможет:)
Ответ 3
xml onClick не работает для вложенных элементов макета, которые динамически раздуваются в API-интерфейсе 19
Ответ 4
Я шокирован, никто не говорил об этом, но будьте осторожны, хотя android:onClick
XML, кажется, удобный способ обработки щелчка, реализация setOnClickListener
делает что-то дополнительное, чем добавление onClickListener
. В самом деле, он поместил свойство view clickable
в значение true.
Хотя это может и не быть проблемой для большинства реализаций Android, по словам конструктора телефона, кнопка всегда по умолчанию имеет значение clickable = true, но другие конструкторы на какой-либо модели телефона могут иметь по умолчанию clickable = false для просмотров без кнопок.
Таким образом, для установки XML недостаточно, вы должны постоянно думать о том, чтобы добавить android:clickable="true"
в не-кнопку, и если у вас есть устройство, в котором значение по умолчанию - clickable = true, и вы даже один раз забываете поместить этот атрибут XML, вы не заметите проблему во время работы, но получите обратную связь на рынке, когда она будет в руках ваших клиентов!
Кроме того, мы никогда не можем быть уверены в том, что proguard будет запутывать и переименовывать атрибуты XML и метод класса, поэтому не на 100% безопаснее, чтобы в один прекрасный день у них никогда не было ошибки.
Итак, если вы никогда не хотите иметь проблемы и никогда не задумываетесь об этом, лучше использовать setOnClickListener
или библиотеки вроде ButterKnife с аннотацией @OnClick(R.id.button)
Ответ 5
Как было сказано ранее: оба они способ добавить логику в ответ на событие, в данном случае событие 'click'.
Я бы пошел на разделение между логикой и презентацией, как и в мире HTML/JavaScript: Оставьте XML для презентации и добавьте прослушиватели событий с помощью кода.
Ответ 6
Если у вас несколько кнопок, использующих только один метод, я предлагаю сделать это в java. Но если у вас есть кнопка с одним конкретным методом, onClick в XML будет лучше.
Ответ 7
Более удобно всегда использовать атрибут android: onClick, если у вас нет веской причины не для того, чтобы, например, создать экземпляр Button во время выполнения или вам нужно объявить поведение кликов в подклассе Fragment.
Ответ 8
Я думаю, что основное различие между ними:
OnClick: когда вы нажимаете на кнопку пальцем.
OnClickListner: Возможно, это более широкий выбор, который реализуется в различных кодах.
Например, когда вы вводите url "ymail.com", yahoo находит ваше имя пользователя и пароль из вашего браузера и включает кнопку состояния нажатия, чтобы открыть вашу почту. Это действие должно быть реализовано только в onClickListener.
Это моя идея!