Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Data Binding

Android Data Binding

Speaking about common features of Android Data Binding support library (http://developer.android.com/tools/data-binding/guide.html).

Kirill Rozov

November 12, 2015
Tweet

More Decks by Kirill Rozov

Other Decks in Programming

Transcript

  1. public class AndroidVersion {
 
 private final String mName;
 private

    final String mNumber;
 
 public AndroidVersion(String name, String number) {
 mName = name;
 mNumber = number;
 }
 
 public String getNumber() { return mNumber; }
 public String getName() { return mName; }
 }
  2. <LinearLayout
 style="@style/AndroidVersion.Root"
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 >
 
 <TextView
 android:id="@+id/name"


    style="@style/AndroidVersion.Name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 />
 
 <TextView
 android:id="@+id/number"
 style="@style/AndroidVersion.Number"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 />
 
 </LinearLayout>
  3. public class VersionViewHolder extends RecyclerView.ViewHolder {
 
 public final TextView

    name;
 public final TextView number;
 
 public VersionViewHolder(View itemView) {
 super(itemView);
 name = (TextView) itemView.findViewById(R.id.name);
 number = (TextView) itemView.findViewById(R.id.number);
 }
 
 public void setVersion(AndroidVersion version) {
 name.setText(version.getName());
 number.setText(version.getNumber());
 }
 }
  4. <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
 <data>
 <variable name="version" type=“com.exposit.databindingsample.AndroidVersion" />
 </data>
 


    <LinearLayout
 style="@style/AndroidVersion.Root"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 >
 
 <TextView
 android:id="@+id/name"
 style="@style/AndroidVersion.Name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{version.name}"
 />
 
 <TextView
 android:id="@+id/number"
 style="@style/AndroidVersion.Number"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{version.number}"
 />
 
 </LinearLayout>
 </layout>
  5. <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
 <data>
 <variable name="version" type=“com.exposit.databindingsample.AndroidVersion" />
 </data>
 


    <LinearLayout
 style="@style/AndroidVersion.Root"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 >
 
 <TextView
 android:id="@+id/name"
 style="@style/AndroidVersion.Name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{version.name}"
 />
 
 <TextView
 android:id="@+id/number"
 style="@style/AndroidVersion.Number"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{version.number}"
 />
 
 </LinearLayout>
 </layout>
  6. <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
 <data>
 <variable name="version" type=“com.exposit.databindingsample.AndroidVersion" />
 </data>
 


    <LinearLayout
 style="@style/AndroidVersion.Root"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 >
 
 <TextView
 android:id="@+id/name"
 style="@style/AndroidVersion.Name"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{version.name}"
 />
 
 <TextView
 android:id="@+id/number"
 style="@style/AndroidVersion.Number"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="@{version.number}"
 />
 
 </LinearLayout>
 </layout>
  7. public class VersionBindingViewHolder extends RecyclerView.ViewHolder {
 
 private final ItemVersionBinding

    mBinding;
 
 public VersionBindingViewHolder(View itemView) {
 super(itemView);
 mBinding = ItemVersionBinding.bind(itemView);
 }
 
 public void setVersion(AndroidVersion version) {
 mBinding.setVersion(version);
 }
 }
  8. <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
 <data>
 <import type="com.exposit.databindingsample.MyStringUtils" />
 <variable name="version"
 type="com.exposit.databindingsample.AndroidVersion"

    />
 </data>
 
 <TextView
 android:id="@+id/name"
 …
 android:text="@{MyStringUtils.toLowerCase(version.name)}"
 />
 </layout> Type import
  9. 
 <data>
 <import type="android.graphics.drawable.Drawable" />
 <variable name="user" type="com.example.User" />
 <variable

    name="image" type="Drawable" />
 <variable name="note" type="String" />
 </data>
 Variables
  10. • Математические операторы • Конкатенация строк • Логические операторы •

    Бинарные операторы • Унарные операторы • Битовые сдвиги • Операторы сравнения • instanceof • Литералы: строковые, числовые, символьные, null • Приведения типа • Вызов методов и доступ к полям • Доступ к элементам массива, List, Sparse List и Map через оператор [] • Тернарный оператор ?: Поддерживаемые операторы
  11. Неподдерживаемые операторы • this • super • new • Явное

    выполнение типизированных методов
 ( Sample.<String>method() )
  12. Null safety Код, сгенерированный библиотекой Data Binding, автоматом проверяет на

    null все объекты и предотвращает NullPoinerException. Например, если в выражение @{version.name} version является null, значение version.name будет являться его значение по умолчанию - null. Если поле или метод будут возвращать примитивный тип данных, то будет использовано значение этого типа по умолчанию.
  13. Type Normal Reference Expression Reference String[] @array @stringArray int[] @array

    @intArray TypedArray @array @typedArray Animator @animator @animator StateListAnimator @animator @stateListAnimator color (int) @color @color ColorStateList @color @colorStateList
  14. public class VersionEventsHandler {
 
 private final VersionBindingViewHolder mViewHolder;
 


    public VersionEventsHandler(
 VersionBindingViewHolder viewHolder) {
 mViewHolder = viewHolder;
 }
 
 public void onVersionClicked(View view) {…}
 }
  15. public class VersionBindingViewHolder extends RecyclerView.ViewHolder {
 
 private final ItemVersionBinding

    mBinding;
 
 public VersionBindingViewHolder(View itemView) {
 super(itemView);
 mBinding = ItemVersionBinding.bind(itemView);
 mBinding.setHandler(new VersionEventsHandler() {
 public void onVersionClicked(View view) {…}
 });
 }
 
 public void setVersion(@NonNull AndroidVersion version) {
 mBinding.setVersion(version);
 }
 }
  16. <layout xmlns:android="http://schemas.android.com/apk/res/android">
 
 <data>
 <variable name="version"
 type=“com.exposit.databindingsample.AndroidVersion" />
 <variable name=“handler"


    type=“com.exposit.databindingsample.VersionEventsHandler" />
 </data>
 
 <View
 …
 android:onClick="@{handler.onVersionClicked}"
 />
 </layout>
  17. Observable Object public class AndroidVersion extends BaseObservable {
 
 private

    String mName;
 private String mNumber;
 
 public AndroidVersion(String name, String number) {
 mName = name;
 mNumber = number;
 }
 
 @Bindable public String getNumber() { return mNumber; }
 
 @Bindable public String getName() { return mName; }
 
 public void setName(String name) {
 mName = name;
 notifyPropertyChanged(BR.name);
 }
 
 public void setNumber(String number) {
 mNumber = number;
 notifyPropertyChanged(BR.number);
 }
 }
  18. Observable Fields public class AndroidVersion {
 
 public final ObservableField<String>

    name;
 public final ObservableField<String> number;
 
 public AndroidVersion(String name, String number) {
 this.name = new ObservableField<>(name);
 this.number = new ObservableField<>(number);
 }
 }
  19. public class TypefaceTextView extends TextView {
 
 public TypefaceTextView(Context context)

    { super(context);}
 
 public TypefaceTextView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(context, attrs, 0);
 }
 
 public TypefaceTextView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init(context, attrs, defStyleAttr);
 }
 
 private void init(Context context, AttributeSet attrs, int defStyleAttr) {
 TypedArray attrsArray =
 context.obtainStyledAttributes(attrs, R.styleable.TypefaceTextView, defStyleAttr, 0);
 String font = attrsArray.getString(R.styleable.TypefaceTextView_font);
 attrsArray.recycle();
 
 if (font != null) {
 AssetManager assets = context.getAssets();
 setTypeface(Typeface.createFromAsset(assets, "fonts/" + font + ".ttf"));
 }
 }
 }
  20. @BindingAdapter("bind:font")
 public static void setFont(TextView textView, String font) {
 AssetManager

    assets = textView.getContext().getAssets();
 String fontPath = "fonts/" + font + ".ttf"
 Typeface typeface = Typeface.createFromAsset(assets, fontPath);
 textView.setTypeface(typeface);
 }
  21. @BindingAdapter({"bind:imageUrl", "bind:errorDrawable"})
 public static void loadImage(
 ImageView imageView, String imageUrl,

    Drawable error) {
 Picasso.with(imageView.getContext())
 .load(imageUrl)
 .error(error)
 .into(imageView);
 }