😎

【Android】DataBinding で拡張関数とプロパティを使う

2021/09/02に公開

DataBindingで拡張関数・プロパティを使うときに少しハマったので、メモとして残します。

拡張関数・プロパティを定義したオブジェクトを import する

簡単な拡張関数・プロパティを定義してみます。

User.kt

data class User(
    val id: Int,
    val name: String,
    val age: Int
)

fun User.toName() = "名前は${name}です"

val User.ageToText: String
    get() = "年齢は${age}歳です"

fragment_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable
            name="user"
            type="com.example.sample.User" />

        <!-- 拡張関数・プロパティを使うときは、これが必要 -->
        <!-- [拡張したオブジェクト名]Ktという名前になっている -->
        <import type="com.example.sample.UserKt" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

	<!-- 引数には拡張したオブジェクトを渡す -->
        <TextView
            android:id="@+id/user_name"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginStart="10dp"
            android:layout_marginEnd="10dp"
            android:gravity="center"
            android:text="@{UserKt.toName(user)}"
            android:textSize="20sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:text="@tools:sample/full_names" />

        <TextView
            android:id="@+id/user_age"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginStart="10dp"
            android:layout_marginEnd="10dp"
            android:gravity="center"
            android:text="@{UserKt.getAgeToText(user)}"
            android:textSize="20sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/user_name"
            tools:text="@tools:sample/full_names" />

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

Discussion