Афоризм
Я всех умней, но это не заметно
Наталья Резник
Последние статьи

 • Ограничение доступа
Ограничение прав доступа к организациям на уровне БД
 • Ролевой механизм
Интегрирование ролей БД в приложениe JaBricks
 • Загрузка модулей
Динамическая загрузка модулей в приложениe
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

Пример Data Binding в Android

На странице рассмотрен пример использования Data Binding в приложении Android. Описание библиотеки представлено на странице Data Binding Library в Android. Кратко отмечу, что использование Data Binding позволяет связать Java-объект с разметкой интерфейса layout (XML-файл). При этом некоторые свойства и методы Java-объекта можно непосредственно перенести в разметку XML-файла.

Заметка : данный пример является прототипом для дальнейшего его «развития» и демонстрации применения Data Binding в сочетании с MVVM (Model-View-ViewModel).

Интерфейс примера

Чтобы легче было понять связь отдельных фрагментов описания кода примера с его конечной целью начнем с интерфейса представления. На скриншоте представлен интерфейс примера после старта в Android Studio. В примере создается 2 компонента типа TextView для отображения имени пользователя и его возраста. Ниже располагается кнопка.

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

Описание кода

Ниже представлен скриншот проекта/модуля databindinglib в IDE Android Studio.

В проекте определены следующие программные объекты, используемые в разработке примера :

• strings.xml — ресурсный файл текстовых строк и шаблона представления возраста;
• activity_main.xml — файл определения интерфейса (разметка, layout);
• User.java — класс описания пользователя;
• MainActivity.java — главный модуль активности.

Интерфейс примера на уровне среды разработки (IDE) определяет главный ресурсный файл activity_main.xml. В режиме исполнения примера главный модуль активности MainActivity.java формирует интерфейс и определяет бизнес-логику управления компонентами. Ресурсный файл strings.xml определяет текстовые значения интерфейсных компонентов. Класс User.java описывает объект пользователя.

Необходимо также добавить, что в файле Gradle Scripts/build.gradle (app.databindinglib) в секцию android добавлено определение dataBinding, согласно описанию библиотеки. Это необходимо выполнить, чтобы получить доступ к библиотеке Data Binding.

На скриншоте раскрыта поддиректория модуля java (generated), в которой представлены генерируемые библиотекой Data Binding программные модули.

Листинг strings.xml

Ресурсный файл strings.xml создается автоматически средой Android Studio при формировании нового модуля/проекта. В модуле переопределен заголок (app_name) и добавлены строки определения текста.

<resources>
    <string name="app_name">Data Binding Lib</string>
    <string name="button">Button</string>
    <string name="age_format">Возраст: %d</string>
</resources>

Заметка : обратите внимание, что строка age_format включает выражение, которое используется для определения возраста пользователя в компоненте View, т.е. текстовое значение компонента формируется динамически.

activity_main.xml

Ниже представлен листинг файла разметки activity_main.xml. На что следует обратить внимание в файле разметки :

  • появился дополнительный внешний/корневой layoutобязательная опция для использования Data Binding в приложении;
  • в файл разметки добавлена секция <data>, в которой определяется переменная user с указанием класса в опции <variable>;
  • компоненты типа TextView, которые используются в java-коде, имеют обязательный идентификатор android:id;
  • текстовые значения интерфейсных компонентов android:text связаны со значениями определенных полей java-объекта user выражением в формате @{variable.field} (user.name, user.age);
  • текстовое значение компонента userAge определяется выражением @string/age_format (int) с использованием, в качестве параметра, user.age.

Листинг activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:tools="http://schemas.android.com/tools"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:android="http://schemas.android.com/apk/res/android">

  <data>
    <variable
        name = "user"
        type="com.example.databindinglib.User"/>
  </data>

  <androidx.constraintlayout.widget.ConstraintLayout
       android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        vandroid:id="@+id/userName"
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="@{user.name}"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/userAge"
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="@{@string/age_format(user.age)}"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf=
                                     "@+id/userName" />
    <Button
        android:id="@+id/button"
        android:layout_width="160dp"
        android:layout_height="48dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="@string/button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/userAge"/>

  </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Класс User.java

Класс User.java — это POJO (Plain Old Java Object), простой Java-объект, не унаследованный от какого-то специфического объекта. Класс содержит 2 поля, конструктор и методы Get/Set. Ниже в свернутом виде представлен листинг класса User.java.

Листинг User.java

package com.example.databindinglib;

public class User
{
    private  String  name;
    private  int     age;
    //---------------------------------
    public User(String name, int age) {
        this.age = age;
        this.name = name;
    }
    //---------------------------------
    public int getAge() {
        return age;
    }
    //---------------------------------
    public void setAge(int age) {
        this.age = age;
    }
    //---------------------------------
    public String getName() {
        return name;
    }
    //---------------------------------
    public void setName(String name) {
        this.name = name;
    }
}
 

MainActivity.java

Файл MainActivity.java наследует свойства активности AppCompatActivity, формирует интерфейс примера и определяет бизнес-логику кнопки подключением к ней слушателя события onClick.

Особенности использования Data Binding в Java-коде :

  • наименование класса ActivityMainBinding определяется наименованием файла разметки activity_main.xml (CamelCase+Binding);
  • объект binding типа ActivityMainBinding создается с использованием статического метода inflate, либо утилиты DataBindingUtil (закомментированный код);
  • текстовые значения интерфейсных компонентов View определяются методом setUser(user) объекта связи binding;
  • подключение обработчика события к кнопке Button выполняется с использованием метода setOnClickListener объекта связи binding.

Таким образом, используя объект связи binding типа ActivityMainBinding можно определить значения интерфейсных компонентов View и подключить к ним обработчики событий.


package com.example.databindinglib;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

// import androidx.databinding.DataBindingUtil;

import com.example.databindinglib
                  .databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity
{
    private ActivityMainBinding binding;
    private User                user   ;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        LayoutInflater inflater = getLayoutInflater();
        binding = ActivityMainBinding.inflate(inflater);

        setContentView(binding.getRoot());

//      binding = DataBindingUtil.setContentView(
//                        this, R.layout.activity_main);
        //-------------------------------------------------
        // Определение значений в интерфейсных компонентах
        user = new User(25, "Alex");
        binding.setUser(user);

        // Подключение обработчика события Click
        binding.button.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    user = new User(23, "Serge");
                    binding.setUser(user);
                }
            }
        );
    }
}
  Рейтинг@Mail.ru