میخوای وارد بازار کار بشی و محصولات خودت رو بفرشی همین الان ثبت نام کن
0

data binding در اندروید

کتابخانه data binding در اندروید

بر کسی پوشیده نیست که اپلیکیشن های اندروید دائما با داده سروکار دارند. این داده ها قاعدتا باید یا از یک منبع داده همچون دیتابیس خوانده شوند یا از اینترنت گرفته شده و در اپلیکیشن مورد نظر برای کاربر به نمایش در آیند.

طبیعتا داده های برنامه باید با نما و ظاهر خاصی در نمایشگر دستگاه نشان داده شوند. همان طور که می دانید در اندروید توسعه دهنده اغلب با آبجکت های fragment ، activity و لایه ها سروکار دارد و ظاهر برنامه را با آیتم های ذکر شده طراحی می کند. در مرحله ی بعدی توسعه دهنده این با جاوا این آبجکت ها را مقدار دهی می کند. نا گفته مشخص است که این کار بسیار تکراری است و در فایل های XML انجام می شود. به این دلیل Google کتابخانه ای ارائه داد که به واسطه ی آن برنامه نویس قادر است به راحتی مقداردهی را در فایل های layout و با همان تگ های XML انجام دهد و سپس مقادیر به viewهای مربوطه متصل شوند. این کتابخانه یک support library هست که با وجود جدید بودن ، به راحتی برای ویرایش های قبلی، البته از ۲٫۱ به بالا قابل استفاده می شود.

این مبحث به شما آموزش می دهد چگونه با استفاده از کتابخانه ی Data Binding در اندروید فایل های layout با فرمت XML بسازید و کد لازم برای متصل کردن منطق اپلیکیشن و فایل های layout  ه( glue code) را به حداقل برسانید.

data binding
 

 

جهت استفاده از این کتابخانه، لازم است افزونه ی اندروید ویرایش ۱٫۵٫۰ سیستم کامپایل Gradle یا بالاتر را نصب نمایید.

به منظور استفاده از این کتابخانه برای اتصال داده، می بایست تکه کد زیر را به فایل app/build.gradle اضافه نمایید

 

android {
....
dataBinding {
enabled = true
}
}

 فایل های layout اتصال داده از model به Data Binding Layout File )  UI )

فایل های layout ای که data binding انجام می دهند، با تگ layout آغاز شده و المان data را به صورت تودرتو در خود دارند و سپس المان آغازین و میزبان view را شامل می شود. این تگ view در واقع المانی است که در یک فایل ،non-binding ریشه یا root در آن قرار می گرفت.در زیر نمونه ای از یک فایل binding layout را مشاهده می کنید:

 

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

اطلاعات data-binding به فایل های layout پروژه ی شما اضافه می شود. در طول پروسه ی build پروژه، کلاس های binding بر اساس اطلاعات این فایل تولید می شوند. به صورت پیش فرض، اسم کلاس binding بر اساس اسم فایل layout ساخته می شود. در واقع اسم فایل با سیستم نوشتاری Pascal نگارش شده و سپس پسوند “Binding” به انتهای آن الصاق می شود. برای مثال اگر اسم فایل layout شما activity_main.xml باشد، اسم کلاس متعاقبا ActivityMainBinding خواهد بود. این کلاس تمامی binding ها از متغیرهای فایل layout( تگ variable که در نمونه فایل فوق مشاهده می کنید) که اشاره گری به View های فایل layout هستند را شامل می شود و همچنین دقیقا می داند چگونه مقادیر را به viewها متصل (bind ) کند. المان data که در فایل بالا مشاهده می کنید، داده هایی را توصیف می کند که قرار است به صورت دو طرفه متصل شوند. Expression ها یا عبارات داخل فایل های layout با دستور نگارشی ”{}@ “ در attribute property ها نوشته می شوند

در این فایل همچنین تگ variableبا نام user را می بینید که یک متغیر ( property ) تعریف می کند و این متغیر می تواند در layout جاری بکار گرفته شود. در واقع این المان اسم یک آبجکت را مشخص می کند که property های آن در این فایل layout مورد دسترسی قرار می گیرد. برای مثال “{user.lastName}@” بیانگر مقدار فیلد lastName از کلاس User می باشد. 

 


data binding و مدیریت event ها

data binding در اندروید به شما اجازه می دهد تا عبارت هایی بنویسید که event های ارسالی و فعال شده از view ها را مدیریت می کنند (برای مثال می توان به onClick اشاره کرد.) اسم attribute های مربوط به event ها بر اساس اسم متد گوش فراخوان آن رخداد (method listener ) مشخص می شود. به طور مثال View.OnLongClickListener() یک متد listener  به نام () onLongClick دارد و از اینرو  attribute مرتبط با این event به این صورت نام گذاری می شود .android:onLongClick

Event ها می توانند به طور مستقیم به متدهای handler متناظر آن ها متصل باشند، همان طور که android:onClick می تواند به یک متد در activity چسبانده شود.

به منظور تخصیص یک event به handler مربوطه، کافی است از یک عبارت اتصال ساده ( )binding expression استفاده کنید. به طوری که مقدار اسم همان متدی باشد که باید با فعال شدن رخداد صدا خورده شود. این عبارت اتصال سپس می تواند listener یا گوش فرادهنده به رخداد کلیک را به view بچسباند.


بروز رسانی رابط کاربری با تغییر رخ داده در  data model

به منظور اتصال داده از model به UI می توان از هر آبجکت ساده ی جاوایی بهره گرفت که در اصطلاح POJO خوانده می شوند. اما متاسفانه تغییر این آبجکت ساده ی جاوا به صورت خودکار سبب بروز رسانی UI نمی شود. به منظور فراهم آوردن بروز رسانی UI همراه با تغییر در model ، آبجکت حاوی داده ها ( data object ) باید بتوانند بخش UI مربوطه را از تغییراتی که در داده ها رخ می دهد، مطلع کنند. در کل سه مکانیزم جهت اطلاع رسانی viewها از تغییرات در model وجود دارد

۱٫ Observable objects

Observable fields .2

۳ Observable collections

برای روش اول، اندروید کلاس BaseObservable را ارائه می دهد که شما می توانید از آن ارث بری کنید. این کلاس که داده ها را در خود نگه می دارد، موظف است به محض اینکه مقادیر

property ها تغییر کردند، view ها از این تغییرات با خبر کند. جهت اعطا نمودن این امکان، کافی است دستور (annotation)  @Bindable را در بالای تابعی که داده را می خواند درج نموده و مطلع ساختن view از تغییرات را در تابعی که مقدار را تنظیم می کند

( setter ) از طریق تابع notifyPropertyChanged(BR.celsius  انجام دهید

 

 

package com.vogella.android.databinding;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
import java.util.Observable;
public class TemperatureData extends BaseObservable {
private String celsius;
public TemperatureData(String celsius) {
this.celsius = celsius;
}
@Bindable 1
public String getCelsius() {
return celsius;
}
public void setCelsius(String celsius) {
this.celsius = celsius; 2
notifyPropertyChanged(BR.celsius);
}
}

۱ یک getter جهت خواندن داده ی مربوطه
۲ توسط این بخش از کد تمامی listener ها را از تغییرات با خبر می سازید. BR.celsius یک کلاس تولید شده توسط Android studio می باشد.
این listener به محض رخداد هر گونه بروز رسانی و تغییر در داده، فراخوانی می شود و view های متناظر را به تناسب با تغییر رخ داده ویرایش می کند. با این مکانیزم برنامه نویس اطمینان حاصل می کند که هرگاه مقادیر model تغییر کردند، بخش UI مربوطه نیز بروز رسانی می شود.

 


پیاده سازی data binding و نمونه ای از کاربرد آن

همان طور که در بالا نیز گفته شد، فایل های layout ای که از data binding پشتیبانی می کنند با تگ layout آغاز شده و یک المان data را شامل می شود که تعریف کننده ی داده ای است که قرار است bind یا دوطرفه متصل شوند. پس از المان  data تگ view میزبان و root را داریم که در یک فایل layout ساده و non-binding همان root و عنصر آغازین محسوب می شد. عبارت های اتصال دو طرفه ی داده ها ( )binding expressions با دستور نگارشی ”{}@“ در فایل مزبور نوشته می شوند.
یک فایل نمونه به صورت زیر نوشته می شود.

 

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

متغیر user در المان ،data در واقع یک property تعریف می کند که می تواند داخل این layout مورد استفاده قرار گیرد.
آبجکتی که داده ها را در خود کپسوله کرده است ( data object
) و همراه این layout بکار می رود، می تواند ظاهری مشابه نمونه ی زیر داشته باشد.

 

package com.vogella.android.databinding;
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
package com.vogella.android.databinding;
import android.app.Activity;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import com.vogella.android.databinding.databinding.ActivityMainBinding;
public class MainActivity extends Activity {
@Override
package com.vogella.android.databinding;
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
package com.vogella.android.databinding;
import android.app.Activity;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import com.vogella.android.databinding.databinding.ActivityMainBinding;
public class MainActivity extends Activity {
@Override

 

 

 


امیدواریم آموزش data binding در اندروید نیز برای شما مفید واقع شده باشد و ادامه آموزش برنامه نویسی اندروید رو دنبال کنید . برای مطالعه پست‌ها بیشتر ، ما را در مدرسه کدنویسی تلگرام  و یا در تی جوان اینستاگرام دنبال کنید.

نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×

سلام کاربر عزیز

هر سوالی دارید در این بخش هستیم تا شما رو راهنمائی کنیم

روی لوگومون کلیک کنید

× چطور میتونم کمکتون کنم؟