Подтвердить что ты не робот

Android onClick в XML против OnClickListener

Я понимаю, что раньше задавался аналогичный вопрос, но это другое. Я новичок в разработке приложений для Android, и у меня есть три вопроса относительно разницы между атрибутом android:onclick="" XML и setOnClickListener.

  • В чем разница между этими двумя? Является ли разница между двумя реализациями, найденными во время компиляции или времени выполнения или оба?

  • Какие варианты использования благоприятны для реализации?

  • Какая разница делает использование фрагментов в Android в выборе реализации?

4b9b3361

Ответ 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.

Это моя идея!