Data Binding در اندروید با استفاده از کاتلین

data binding در کاتلین

کتابخونه‌ی Data Binding یکی از کتابخونه‌های اندرویده که باعث میشه بتونید دیتا رو به المان‌های توی ‌UI خودتون بدون واسطه بچسبونید. نکته‌‌ی این کتابخونه اینجاست که نیاز ما به نوشتن کد توی کلاس رو کمتر می‌کنه و باعث خوانایی و سریع تر شدن کد‌هامون میشه. این کتابخونه سال ۲۰۱۵ معرفی شد و چون جزو Support Library ها محسوب میشه از اندروید نسخه ۷ به بالا رو پشتیبانی می کنه.


توی برنامه نویسی به صورت سنتی ما نیاز داشتیم که توی اکتیویتی خودمون ابتدا المان UI رو با استفاده ازfindWiewById پیدا کنیم و بعد به اون مقدار بدیم:

TextView txtView = findViewById(R.id.text_demo);
txtView.setText(model.email);

کد بالا در صورت استفاده از دیتا بایندینگ به صورت زیر در میاد. ما کد رو مستقیم داخل view خودمون قرار میدیم:

<TextView
    android:text="@{model.email}" />

و البته فایل layout مناسب برای استفاده از دیتا بایندینگ یه سری تغییرات به نسبت layout های معمولی داره. این فایل با تگ layout شروع میشه و یک تگ اضافه به اسم data هم داره:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="person" type="ir.kivee.Person"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="@{person.firstName}"/>
       <TextView android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:text="@{person.lastName}"/>
   </LinearLayout>
</layout>

شروع کار با Data Binding در اندروید با استفاده از کاتلین

برای فعال کردن Data Binding کافیه کد زیر رو به تگ android توی فایل گریدل خودمون اضافه کنیم:

dataBinding{
enabled=true
}

نکته: من دارم با کاتلین برنامه نویسی می کنم پس باید پلاگین kotlin-kapt رو به همراه دیپندنسی مربوطش به گریدل اضافه کنم، فایل گریدل من مثل حالت زیر میشه:

apply plugin: 'kotlin-android'                       
apply plugin: 'kotlin-kapt'
android {
    ....
    dataBinding {
        enabled = true
    }
}dependencies {
    ...
    // نسخه‌ی استفاده شده باید ورژنش با نسخه‌ی گریدل استفاده شده توی پروژه یکسان باشه
    kapt "com.android.databinding:compiler:$gradle_version"
}

الان گریدل ما آمادست. توی این مرحله ما یه مدل می‌سازیم تا بتونیم به ویو خودمون متصلش کنیم، من کلاسی به اسم UserModel ساختم:

data class UserModel(var userName:String, var password:String)

حالا که کلاس مدل ما ساخته شده، میتونیم تغییرات لازم رو روی فایل layout خودمون هم بدیم. من یه فرم ساده‌ی لاگین می سازم:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<data>

<variable
name="userModel"
type="ir.kivee.myapplication.UserModel" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_light"
tools:context=".MainActivity">

<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/aMainUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"

android:text="@={userModel.userName}"

android:layout_margin="24dp"
android:background="@android:color/white"
android:padding="6dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<androidx.appcompat.widget.AppCompatEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"

android:text="@={userModel.password}"

android:background="@android:color/white"
android:padding="6dp"
android:id="@+id/aMainPassword"
android:inputType="textPassword"
app:layout_constraintTop_toBottomOf="@id/aMainUsername" />

<androidx.appcompat.widget.AppCompatButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:layout_margin="12dp"
android:text="ورود"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"/>

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

ما توی تگ data همه‌ی مدل‌هایی که قراره اونها رو بایند کنیم مشخص می کنیم و بعد توی view های خودمون مقدار مورد استفادمون رو مشخص می کنیم:

android:text="@={userModel.userName}"

در حالت کلی اندروید استودیو به صورت اتوماتیک برای هر layout یک کلاس binding می سازه. اسم این کلاس از فرمت PascalCase فایل لایوت خودمون به اضافه‌ی کلمه‌ی Binding در انتهای اون تشکیل شده، یعنی فایل باندینگ ساخته شده برای activity_main.xml ما به صورت ActivityMainBinding در میاد. برای ایجاد این کلاس کافیه یک بار پروژه رو بیلد کنیم.

حالا توی MainActivity خودمون باید کلاس DataBinding، لایوت و مدل خودمون رو به هم بچسبونیم:

class MainActivity : AppCompatActivity() {
lateinit var mainBinding : ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val userModel = UserModel("payam","123")
mainBinding.userModel = userModel
}
}

الان اگر پروژه رو ران کنیم باید با حالت زیر روبرو بشیم:

۲ دیدگاه On Data Binding در اندروید با استفاده از کاتلین

جوابی بنویسید:

آدرس ایمیل شما به صورت عمومی منتشر نخواهد شد.

فوتر سایت

اسلایدر سایدبار