Сделайте ваш код более читабельным

Привязка данных считается одной из лучших практик в современной разработке для Android. Это часть реактивного ранца Android. Это устраняет findViewById(), что иногда является дорогостоящей операцией. Есть много преимуществ привязки данных. Это делает наш код кратким, легко поддерживаемым и читабельным.

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

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

Что мы читаем

Это отличное приложение. Не так ли?

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

Для этой статьи используется этот репозиторий GitHub. Не стесняйтесь проверить это. Давайте начнем

Привязка данных в действии

Сначала включите параметр сборки dataBinding в файле build.gradle вашего модуля приложения.

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

Чтобы сгенерировать класс привязки, нам нужно обернуть наш макет тегом <layout></layout>. В качестве примера, давайте проверим ниже fragment_image_viewer.xml .

Как видите, вместо того, чтобы начинать с ConstraintLayout, я начал с тега <layout></layout>. О теге <data></data> я расскажу позже. Теперь настройка завершена, и если мы создадим наш проект, будет сгенерирован класс привязки.

Привязка имеет соглашение об именах. Он берет имя макета XML, удаляет подчеркивание и заставляет каждое имя начинаться с заглавной буквы. Затем добавьте обвязку в конце. Смущенный? В качестве примера,

fragment_image_viewer.xml -> FragmentImageViewerBinding

Надеюсь теперь понятно.

Как получить доступ к привязке

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

private var _binding: FragmentImageViewerBinding? = null
private val binding get() = _binding!!

Вы можете увидеть тип данных _binding is FragmentImageViewerBinding . Вы можете спросить, а нельзя ли получить доступ к обычной переменной FragmentImageViewerBinding? Да, ты можешь. Но в этом случае есть вероятность утечки памяти. Если вы хотите узнать больше об утечке памяти в Android, ознакомьтесь с этой статьей.

Раньше мы устанавливали макет с помощью setContentView, но вместо этого мы можем сделать, как показано ниже.

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    // Inflate the layout for this fragment
    _binding = FragmentImageViewerBinding.inflate(inflater, container, false)
    return binding.root
}

Теперь мы можем использовать переменные binding для доступа к нашему компоненту макета и выполнения операции, связанной с макетом. В качестве примера для установки текста в TextView мы можем использовать binding.textView.text = "text" .

Что такое тег данных

Ранее я говорил, что о теге <data></data> расскажу позже. Теперь пришло время поговорить об этом.

Проще говоря, <data> объявляет, что есть данные, а тег <variable> описывает имя и тип данных. Вы можете получить доступ к значению в XML просто "@{variable_name}" . Вы можете передавать любые данные, а также пользовательские объекты внутри тега <variable>. В этом прелесть привязки данных.

В приведенном выше примере вы можете видеть, как показано ниже

<data>
    <variable
        name="imageSrc"
        type="com.farhan.tanvir.pexels.data.model.Src" />
</data>

Здесь имя переменной — imageSrc, а тип — пользовательский объект (в данном случае класс данных). Вы можете установить переменную imageSrc от ImageViewerFragment до binding.imageSrc = imageSrc . Теперь вы можете получить доступ к переменной imageSrc в макете, просто нажав "@{imageSrc}" .

Как использовать пользовательскую привязку данных

Еще одна прелесть привязки данных — настройка. Давайте создадим пользовательскую привязку данных, которая будет загружать изображение в ImageView.

Здесь я создал пользовательское имя привязки loadImageFromUrl, которое будет загружать изображение в файл ImageView. Мы можем использовать эту пользовательскую привязку в ImageView макета XML, как показано ниже.

<ImageView
    loadImageFromUrl="@{imageUrl}"
    android:id="@+id/wallpaperImageView"
   />

Теперь он загрузит изображение в ImageView . Потрясающий. Не так ли?

Это все на сегодня. Надеюсь, вы узнали что-то полезное.

Если у вас есть предложения, поделитесь ими в комментариях. Пока мы не встретимся снова… Ура!

Want to Connect?If you want to, you can connect with me on Twitter or LinkedIn.