Bindview android что это

Butter Knife

Field and method binding for Android views

Deprecation Notice

This tool is now deprecated. Please switch to view binding. Existing versions will continue to work, obviously, but only critical bug fixes for integration with AGP will be considered. Feature development and general bug fixes have stopped.

Introduction

Annotate fields with @BindView and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout.

Instead of slow reflection, code is generated to perform the view look-ups. Calling bind delegates to this generated code that you can see and debug.

The generated code for the above example is roughly equivalent to the following:

Resource Binding

Bind pre-defined resources with @BindBool , @BindColor , @BindDimen , @BindDrawable , @BindInt , @BindString , which binds an R.bool ID (or your specified type) to its corresponding field.

Non-Activity Binding

You can also perform binding on arbitrary objects by supplying your own view root.

Another use is simplifying the view holder pattern inside of a list adapter.

You can see this implementation in action in the provided sample.

Calls to ButterKnife.bind can be made anywhere you would otherwise put findViewById calls.

Other provided binding APIs:

  • Bind arbitrary objects using an activity as the view root. If you use a pattern like MVC you can bind the controller using its activity with ButterKnife.bind(this, activity) .
  • Bind a view’s children into fields using ButterKnife.bind(this) . If you use tags in a layout and inflate in a custom view constructor you can call this immediately after. Alternatively, custom view types inflated from XML can use it in the onFinishInflate() callback.

View Lists

You can group multiple views into a List or array.

The apply method allows you to act on all the views in a list at once.

Action and Setter interfaces allow specifying simple behavior.

An Android Property can also be used with the apply method.

Listener Binding

Listeners can also automatically be configured onto methods.

All arguments to the listener method are optional.

Define a specific type and it will automatically be cast.

Specify multiple IDs in a single binding for common event handling.

Custom views can bind to their own listeners by not specifying an ID.

Binding Reset

Fragments have a different view lifecycle than activities. When binding a fragment in onCreateView , set the views to null in onDestroyView . Butter Knife returns an Unbinder instance when you call bind to do this for you. Call its unbind method in the appropriate lifecycle callback.

Optional Bindings

By default, both @Bind and listener bindings are required. An exception will be thrown if the target view cannot be found.

To suppress this behavior and create an optional binding, add a @Nullable annotation to fields or the @Optional annotation to methods.

Note: Any annotation named @Nullable can be used for fields. It is encouraged to use the @Nullable annotation from Android’s «support-annotations» library.

Multi-Method Listeners

Method annotations whose corresponding listener has multiple callbacks can be used to bind to any one of them. Each annotation has a default callback that it binds to. Specify an alternate using the callback parameter.

Источник

Шпаргалка или Must have для андроид разработчика

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

Butterknife

Библиотека была разработана компанией Square и сразу же прижилась у разработчиков. ButterKnife был создан на замену findViewById для того чтобы уменьшить и без того раздутые activity :

Вы только посмотрите какая длинная строка! А если это поле класса — то это целых две строки:

А теперь перейдем к ButterKnife. Вот простой пример кода с ButterKnife:

Все очень просто: с помощью аннотации @BindView мы говорим какая вьюха нам нужна, и потом главное не забыть про ButterKnife.bind(this); (Так делать нужно в активити, для других мест вроде holder или fragment это делают немного по-другому. Смотрите здесь.

Читайте также:  Минималистичные лаунчеры для андроид

Как добавить к проекту?

Gradle(app module):

Retrofit 2

Компания Square создала не только ButterKnife, но и много других прекрасных библиотек без которых многие разработчики не представляют свою жизнь. Одна из таких библиотек Retrofit 2.

Она была создана для того чтобы упростить работу с REST API. Раньше чтобы сделать запрос приходилось воротить горы кода, но сейчас все по-другому. Итак, как же сделать запрос?

Добавить в gradle(app module):

Сначала берут сайт для конвертации с json в pojo вроде этого и копируют все классы которые сгенерировались в AndroidStudio:

Потом создают интерфейс(Я использую retrofit вместе с RxJava):

В QueryMap бросают query параметры(например api key). Хотя можно вместо @QueryMap использовать просто Query но тогда для каждого параметра надо прописать свой query.

Потом нужно за полнить параметры данными:

И вызвать iweatherProvider.getWeather(mapJson);

В случае если вы не используете RxJava замените в интерфейсе Observable на Call и сделайте

Dagger 2

Создан гуглом. Помогает реализовать паттерн Dependency Injection. С помощью Dagger’а можно круто структурировать проект, что очень хорошо сказывается на читабельности кода и помогает в тестировании(кстати использовать retrofit вместе с dagger’ом само наслаждение). Смысл в том что все классы хотят работать уже с готовыми данными, им нужно лишь получить их, и что-то с ними сделать. Но кто-то должен предоставлять данные. Эту роль на себя берет dagger. Основа Dagger это компоненты, вот один из них:

Все компоненты состоят из модулей, в одном компоненте может быть несколько модулей, вот пример модуля:

Внутри модулей находятся функции с аннотацией Provides, как следует из аннотации они поставляют данные. В основном эти функции делят на модули по смыслу(к примеру геолокация). И здесь возникает логичный вопрос, ну как это использовать?

Очень просто. В вашей активити помечаете поля которые должны получить данные аннотацией Inject( @Inject IWeatherProvider mWeatherProvider; ). Потом создаете свой Application класс:

В MainActivity в OnCreate сделайте следущее:

P.S. Не забудьте добавить App класс в манифест.

в gradle(project module):

Но что если одной из функций на вход тоже нужны данные? В таком случае dagger пробегается по компоненту в поисках функции которая возвращает необходимый класс или тип данных, и когда находит — вызывает.

Что будет если я поменяю название функции? Dagger’у абсолютно все равно на название, его интересуют лишь сигнатуры, поэтому на работу это не влияет.

Студия подсвечивает класс DaggerRetrofitComponent красны. Что делать? Dagger работает на кодогенерации поэтому в таком случает стоит просто сделать rebuild.

Multidex

Рано или поздно разработчик сталкивается с проблемой в 65 тысяч методов. Но начнем сначала. Когда вы хотите установить приложение на телефон вам нужен apk файл. Основа любого apk файла dex файл. Dex файл — это ваши java классы собранные в один файл. Но у dex файла есть ограничение в 65 тысяч методов. И большая часть приложений превышает этот лимит и получает exception при сборке. Для таких случаев создан multidex. В gradle(app module) добавляете:

Благодаря int00h, я исправлю ранее ошибочную информацию.
Для подключения MultiDex есть 3 способа:

  • Указать в манифесте у application параметр
  • Отнаследовать свой класс App от MultiDexApplication
  • Вызвать MultiDex.install(this);
    в методе attachBaseContext(Context) своего класса App

Пост вышел длинным, но зато я надеюсь что хот как-то объяснил. А какими библиотеками пользуетесь вы?

Источник

Долгожданный View Binding в Android

Пару дней назад Google выпустил Android Studio 3.6 Canary 11, главным нововведением в которой стал View Binding, о котором было рассказано еще в мае на Google I/O 2019.

View Binding — это инструмент, который позволяет проще писать код для взаимодейтсвия с view. При включении View Binding в определенном модуле он генерирует binding классы для каждого файла разметки (layout) в модуле. Объект сгенерированного binding класса содержит ссылки на все view из файла разметки, для которых указан android:id .

Как включить

Чтобы включить View Binding в модуле надо добавить элемент в файл build.gradle :

Также можно указать, что для определенного файла разметки генерировать binding класс не надо. Для этого надо указать аттрибут tools:viewBindingIgnore=»true» в корневой view в нужном файле разметки.

Как использовать

Каждый сгенерированный binding класс содержит ссылку на корневой view разметки ( root ) и ссылки на все view, которые имеют id. Имя генерируемого класса формируется как «название файла разметки», переведенное в camel case + «Binding».

Например, для файла разметки result_profile.xml :

Будет сгенерирован класс ResultProfileBinding , содержащий 2 поля: TextView name и Button button . Для ImageView ничего сгенерировано не будет, как как оно не имеет id . Также в классе ResultProfileBinding будет метод getRoot() , возвращающий корневой LinearLayout .

Читайте также:  How to update android samsung

Чтобы создать объект класса ResultProfileBinding , надо вызвать статический метод inflate() . После этого можно использовать корневой view как content view в Activity :

Позже binding можно использовать для получения view:

Отличия от других подходов

Главные преимущества View Binding — это Null safety и Type safety.

При этом, если какая-то view имеется в одной конфигурации разметки, но отсутствует в другой ( layout-land , например), то для нее в binding классе будет сгенерировано @Nullable поле.

Также, если в разных конфигурациях разметки имеются view с одинаковыми id, но разными типами, то для них будет сгенерировано поле с типом android.view.View .
(По крайней мере, в версии 3.6 Canary 11)

А вообще, было бы удобно, если бы сгенерированное поле имело наиболее возможный специфичный тип. Например, чтобы для Button в одной конфигурации и TextView в другой генерировалось поле с типом TextView ( public class Button extends TextView ).

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

Использование в RecyclerView.ViewHolder

Ничего не мешает использовать View Binding при создании view для RecyclerView.ViewHolder :

Однако, для создания такого ViewHolder придется написать немного бойлерплейта:

Было бы удобнее, если при работе с RecyclerView.ViewHolder метод inflate(. ) не будет иметь параметр layoutInflater , а будет сам получать его из передаваемого parent .

Тут нужно ещё упомянуть, что при использовании View Binding поиск view через findViewById() производится только один раз при вызове метода inflate() . Это дает преимущество над kotlin-android-extensions , в котором кеширование view по умолчанию работало только в Activity и Fragment , а для RecyclerView.ViewHolder требовалась дополнительная настройка.

В целом, View Binding это очень удобная вещь, которую легко начать использовать в существующих проектах. Создатель Butter Knife уже рекомендует переключаться на View Binding.

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

Источник

Обзор Butter Knife

Библиотека Butter Knife позволит вам избежать большого количества однотипного кода, связанного с работой с View элементами в ваших Activity, фрагментах, холдерах и т.д. В этом материале я подробно рассмотрю возможности библиотеки, и на примерах покажу, как вы можете ее использовать.

Зачем нужен Butter Knife

Рассмотрим простой пример. Бывает необходимость показывать/скрывать сразу несколько View в Activity. В стандартном варианте реализации это может выглядеть так:

Объявление списка, поиск элементов по findViewById и добавление в список, перебор списка и установка видимости.

А вот реализация с использованием Butter Knife (и Retrolambda)

Объявление списка, поиск элементов по findViewById и добавление в список — все это выполнила аннотация @BindViews, избавив нас от написания нескольких строк однотипного кода.

А комбинация Butter Knife + Retrolambda позволила одой строкой поменять видимость всем View в списке.

Кроме биндинга View элементов, библиотека умеет вешать на View различные обработчики, выполнять операции над коллекциями View и биндить значения из values. Давайте на примерах рассмотрим все эти возможности.

Подключение к проекту

Для подключения библиотеки к проекту необходимо добавить строки в dependencies в gradle файл модуля

View Binding

BindView

Аннотация BindView избавит вас от необходимости писать строки с findViewById.

Рассмотрим пример. В layout файле описан TextView:

Используем BindView, чтобы получить доступ к этому TextView в Activity:

При работе с BindView от нас требуется указать id TextView элемента и переменную, в которую необходимо этот TextView поместить.

А в onCreate необходимо вызвать метод ButterKnife.bind и передать туда Activity. Этот метод найдет все Butter Knife аннотации в Activity и выполнит необходимые действия. В нашем случае он увидит аннотацию BindView, возьмет R.id.title, найдет TextView и поместит в textViewTitle.

После вызова ButterKnife.bind мы можем работать с textViewTitle.

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

Использование BindView для нескольких View элементов выглядит так:

После вызова ButterKnife.bind все эти переменные будут заполнены и готовы к работе.

Если вы используете Butter Knife в фрагментах, то необходимо использовать Unbinder из-за особенностей Fragment Lifecycle.

В onCreateView вызываем bind и сохраняем полученный Unbinder объект в переменную unbinder. А в onDestroyView вызываем unbinder.unbind.

Также, вы можете использовать Butter Knife в холдерах при работе со списками:

Nullable

По умолчанию, если BindView не найдет View с указанным id, то он вызовет Exception. Чтобы избежать этого, используйте аннотацию Nullable.

BindViews

BindViews соберет указанные View в список или в массив.

Собираем три различных View (TextView, EditText, ProgressBar) в список с общим типом — View

Читайте также:  Фризер для андроид что это такое

Собираем два View (TextView, EditText) в список с общим типом — TextView.

Обработчики

ButterKnife позволяет удобно назначать для View наиболее распространенные обработчики

OnClick

Пометив метод аннотацией OnClick мы указываем, что этот метод будет являться обработчиком клика на View

Теперь, при клике на View с будет вызван метод onSaveClick. И вам уже не надо писать ни findViewById, ни setOnClickListener. BindView в этом случае вам также не нужен.

Если необходимо передавать «кликнутый» View в этот метод, то просто добавьте View в параметры метода:

Если вам надо получить конкретный тип View, например, Button, то укажите его:

Butter Knife позволяет назначить один обработчик нескольким View.

OnCheckedChanged

Можно использовать, например, для чекбоксов, чтобы получать его checked-состояние

При изменении значений чекбокса с будет вызываться метод onAgreeChecked.

Параметры метода могут варьироваться. Например, можно получать непосредственно View, которое было “чекнуто”

А можно получать и View и checked-значение

OnTextChanged

Интерфейс TextWatcher содержит следующие методы:

По умолчанию, Butter Knife создает обработчик, соответствующий методу onTextChanged

Если вам нужны два других метода, это делается так:

В аннотации OnTextChanged вам необходимо с помощью параметра callback указать, какой именно метод вам необходим. А метод onTextChanged идет по умолчанию, поэтому для него можно не указывать callback.

Этот же прием с callback используется для других обработчиков, которые содержат два и более методов. Каждый из них содержит документацию, в которой все это описано.

Посмотреть документацию в Android Studio можно поставив курсор на нужную вам аннотацию и нажав CTRL+Q.

Прочие обработчики

Перечислю, какие еще аннотации вы можете использовать и каким обработчикам они соответствуют.

Optional

По умолчанию, если аннотация обработчика не найдет View с указанным id, то она вызовет Exception. Чтобы избежать этого, используйте аннотацию Optional.

Операции

Butter Knife может выполнять определенные операции над одним View или целой группой View. Для этого используется метод ButterKnife.apply. Его можно вызывать для одного View, списка View и массива View.

Операции бывают трех типов

Action

Если применить Action к группе View, он будет выдавать вам View по одному и указывать его индекс, а вы уже решаете, что с этим View делать.

Например, есть задача, собирать текст со всех EditText в один StringBuilder. Это можно реализовать так:

При создании Action, указываем, что тип View будет EditText. Внутри Action, в методе apply, мы будем получать по одному все наши EditText и их позиции в списке. Для каждого из них мы добавляем в StringBuilder индекс и текст.

Остается вызывать метод ButterKnife.apply и передать ему список EditText-ов и Action.

В итоге, Action будет применен ко всем EditText из списка viewList. И StringBuilder будет содержать пронумерованные тексты из всех EditText.

Property

С помощью Property вы можете быстро установить какое-либо свойство целой группе View.

Setter

Похож на Action, но позволяет дополнительно передавать значение внутрь метода операции.

Например, мы можем создать Setter, который будет устанавливать видимость View.

При создании, мы указываем тип View и тип значения которое будем передавать — Integer. В методе set мы получим View и его индекс (аналогично Action), а также значение Integer, которое будем использовать в методе setVisibility.

Использование этого сеттера выглядит так

В метод apply передаем список View, сеттер и значeние View.VISIBLE. Сеттер прогонит через себя весь список View и для каждого выполнит метод setVisibility(View.VISIBLE).

А если хотим спрятать все View, то используем этот же сеттер, но с значением View.INVISIBLE

Value Binding

Кроме View вы можете биндить различные значения из папки values.

Можно получить как float, так и int значение.

Существуют следующие аннотации для биндинга значений:

Я описал практически все возможности текущей версии Butter Knife. Если чего пропустил, или с выходом новой версии появилось что-то интересное, пишите на форуме — я дополню материал.

Plugin

Для Android Studio есть полезный плагин

Он за вас сможет создать BindView и OnClick.

При использовании, убедитесь, что курсор стоит на layout файле.

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью