Рубрики
Без рубрики

Привязка данных для Android

Учебник по отличной библиотеке привязки данных Android.

Автор оригинала: Eliran Goshen.

Вступление

Если вы являетесь разработчиком клиента, вы, вероятно, слышали о привязке данных. Это одна из наиболее основных концепций, используемых во многих известных фреймворках (таких как angular.js , C# WPF, Swift Реактивный комплект…)

Так из-за чего весь этот шум ?

Проще говоря, привязка данных-это процесс, который синхронизирует (связывает) элементы и бизнес-логику, поэтому при изменении логики (данных) меняются элементы ,связанные с этими данными ,и наоборот ,следовательно, они связаны друг с другом.

Поначалу это может показаться неважным, но это действительно важный принцип, потому что он помогает отделить пользовательский интерфейс от бизнес-логики, что является основным принципом разработки хорошей архитектуры для наших приложений. (и используется в MVVM и других шаблонах проектирования).

Типы привязки данных

Если вы раньше работали с xml, вы, вероятно, заметили, что есть способ преобразовать его в объект и работать только с этим объектом, этот процесс называется удалением. И после того , как мы закончим с этим объектом, мы, возможно, захотим вернуть его в XML в процессе, называемом сортировкой.

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

Другим типом привязки является привязка данных пользовательского интерфейса, которая связывает данные с объектами пользовательского интерфейса (текст, редактируемые тексты…) , поэтому мы можем управлять элементом пользовательского интерфейса с помощью данных, и наоборот.

Сегодня все чаще используется привязка пользовательского интерфейса , и она используется во многих современных клиентских фреймворках.

Есть 2 способа сделать привязку:

Односторонняя привязка

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

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

Двусторонняя привязка

Двусторонняя привязка-это полная синхронизация между исходными и целевыми свойствами. Означает, что каждое изменение в свойстве источника будет отражаться в целевом объекте, и наоборот. Типичное использование может быть в редактируемой форме/поле. Например, у нас есть текст имени, который можно редактировать, поэтому мы можем захотеть синхронизировать его с данными имени, которые он представляет, чтобы каждое изменение, которое мы внесем в поле, отражалось в пользовательском интерфейсе, и наоборот.

Структура привязки данных Everett должна использовать связующее , которое является частью, создающей привязку между элементами.

Привязка данных для Android

Впервые представленный в Google I/O 2015 , Android имеет собственную библиотеку привязки данных, которая содержит множество функций для упрощения нашей работы с данными и написания меньшего количества шаблонного кода.

Декларативные макеты

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

Имя: fragment_profile.xml


   
       
    

И после привязки данных:


  
     
   

   
       
   

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

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

User user = ...
…

FragmentNameBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_profile, null, false);
binding.setUser(user);

И теперь мы явно задаем пользовательский интерфейс, хранящийся вместе с данными.

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

Способ сделать это в библиотеке привязки данных Android-использовать BaseObservable и Наблюдаемое поле :

Определите привязку с помощью наблюдаемой базы

Мы можем создать класс , производный от Base Observable , и привязать его к представлению:

private static class User extends BaseObservable {
   private String firstName;
   private String lastName;
   @Bindable
   public String getName() {
       return this.name;
   }
   public void setName(String name) {
       this.name = name;
       notifyPropertyChanged(BR.name);
   }
}

Нам нужно аннотировать геттер привязываемого объекта в аннотации @Bindable. Далее нам нужно вызвать NotifyPropertyChanged в сеттере объекта с сгенерированным именем, которое мы объявили в геттере @Bindable.

NotifyPropertyChanged проделывает всю магию – он уведомляет все соответствующие прикрепленные представления о том, что данные были изменены, поэтому он соответствующим образом изменит представление.

Для этого нам нужно было расширить нашу модель, но что, если у нас уже есть другой родитель ?

В этом случае мы можем использовать Наблюдаемое поле .

Определите привязку с помощью наблюдаемого поля

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

private static class User {
   public final ObservableField name = new ObservableField<>();
}

И это все!

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

Но привязка, если мы изменим данные, но что, если мы изменим представление ?

Двусторонняя привязка

До недавнего времени не было простого способа реализовать двустороннюю привязку, поэтому разработчикам приходилось вручную писать эту часть. (например, используйте TextWatcher ). Но теперь есть очень простой способ сделать это, на самом деле разница не более 1 символа:

В макете вместо этого:

@{user.name}

Мы используем это:

@={user.name}

Если мы добавим”=”, он будет поддерживать двустороннюю привязку. Вот так просто !

Более интересные функции библиотеки привязки данных Android, которые стоит знать

Когда мы получим класс привязки с помощью DataBindingUtil , он автоматически генерирует ссылку на идентификаторы представлений, и мы можем получить к нему доступ, используя идентификатор представления camelcase из этого класса. Это означает, что теперь у нас есть глобальная ссылка на каждый идентификатор представления, и нам больше не нужно использовать findViewById ((или Нож для масла)

В дополнение к данным можно использовать привязку событий. (например, привязка слушателя) Можно использовать привязку данных с RecyclerView с помощью setVariable и выполнить Ожидающие Привязки :

private class BindingViewHolder extends RecyclerView.ViewHolder {
   public BindingViewHolder(View itemView) {
       super(itemView);
   }

   public ViewDataBinding getBinding() {
       return DataBindingUtil.getBinding(itemView);
   }
}
@Override
public void onBindViewHolder(BindingViewHolder holder, int position) {
   SimpleUser user = users[position];
   holder.getBinding().setVariable(BR.user, user);
   holder.getBinding().executePendingBindings();
}
 

Одна действительно классная функция – @BindingAdapter, с помощью которой мы можем фактически привязать всю функцию к представлению с помощью пользовательского атрибута. Типичным вариантом использования может быть loadimagefromweb , а затем привязать его к ImageView , чтобы мы могли создать атрибут URL-адрес изображения , а затем используйте в представлении просто как:

Пример использования:

@BindingAdapter({"bind:imageUrl"})
 public static void loadImage(ImageView view, String url) {
     Picasso.with(
             view.getContext()).
             load(url).
             into(view);
 }

Вывод

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

Вы можете найти более подробную информацию на официальной странице.

Оригинал: “https://www.codementor.io/@elirangoshen/android-data-binding-5wnz20h6x”