حمیدرضا خواجه
حمیدرضا خواجه
خواندن ۵ دقیقه·۶ سال پیش

پیاده سازی Data Binding در اندروید

مدیریت کد و معماری اون در برنامه نویسی یکی از مهمترین موضوعاتیه که هر توسعه دهنده با اون روبرو هست و خب برنامه نویسان اندروید هم از این قاعده مستثنا نیستن؛ Data Binding یکی از موارد مهمی هستش که اگر به اون مسلط بشید میتونید ارتباط ViewModel(داده هاتون) رو با View به بهترین شکل ممکن و با کمترین خط کد برقرار کنید.

Data Binding In Android
Data Binding In Android

در قسمت قبلی از سری مقالاتم در مورد اهمیت استفاده از معماری و همینطور اهمیت کد نویسی تمیز صحبت کردم؛ اگر برنامه نویس اندروید باشید میدونید که یک برنامه ساده از تعداد زیادی View ساخته میشه؛ برای مثال TextView که متن رو شامل میشه یک View هستش یا همینطور ImageView که شامل عکس های پروژه میشه یا... همونطوری که میدونید برای ساخت ظاهر برنامه در اندروید از زبان xml استفاده میشه، در واقع ما المنت های رابط کاربری مون رو در xml میسازیم(مثل همون مثالای بالا) و سپس ویو هایی که ساختیم رو در سمت Java معرفی میکنیم تا بتونیم باهاش منطق برنامه رو بسازیم.

خب این یک فرایند ساده ساخت رابط کاربری توی اندروید بود، اما چرا باید از Data Binding استفاده کنیم؟
بصورت سنتی با متد findViewById ما هر بار میاییم و یک View میسازیم و بعد از اون میاییم Data رو بر روی این View ست میکنیم(یا حالا هرکاری که بخوایم با اون View انجام میدیم)؛ اما این کار همونطوری که مطلع هستید خیلی وقت گیر و زمان بر هستش؛ Data Binding اومده تا این فرایند رو کوتاه تر کنه تا هم حوصله ما برنامه نویسای اندروید کمتر سر بره و هم خوانایی کد بهتر میشه؛ به این صورت که میتونیم Data Model مون رو بصورت مستقیم به لایه xml پاس بدیم و دیگه نیازی به معرفی ویو در Java و ست کردن مقدار اونجا نیست؛ یعنی شما با حذف کردن حدودی ست کردن دیتا روی View در جاوا، دیتا رو مستقیما به رابط کاربری توی xml میفرستید و از اونجا داده مستقیما روی View شما ست میشه! یعنی شما عملا دارید میانبر میزنید! به همین راحتی!

خب دیگه توضیحاتمون زیاد شد، بهتره بریم توی کار ببینیم چجوریه؛ برای درک بهتر من یک مینی پروژه خیلی ساده رو پیاده سازی میکنم تا بخوبی با مطالب آشنا بشید.
و اما منطق برنامه: برنامه ای که میخوایم پیاده سازی کنیم دارای دو صفحه هست، در صفحه اول که LoginActivity نام داره، چهار مقدار name, Last Name, gender, Job رو از کاربر دریافت میکنیم و به محض دریافت کردن اطلاعات اونارو پاس میدیم به صفحه دوم که ProfileActivity اسمش هست و این صفحه هم دریافتی رو با استفاده از Data Binding روی View هامون ست میکنه.

1- آغاز کار: بعد از ساختن دو تا صفحه مورد نیازمون، میریم سراغ کانفیگ پروژه(کلیک کنید)
مهمترین قسمت صفحه Build.gradle ما در واقع این دستور هستش:

با دستور dataBinding و Enable کردن اون در واقع پروژه شما تنظیمات مربوط به Data Binding رو دانلود و نصب میکنه.

2-حالا بریم سراغ ساخت کلاس دیتا مدل Person(کلیک کنید)
بعد از ساختن دیتا مدل و با دانش به اینکه دوتا صفحه(اکتیویتی Profile و Login) رو ساختید میریم سراغ کامل کردن اون قسمت ها؛ اول از همه صفحه لاگین توی نرم افزار اجرا میشه که لایه های xml صفحه activity_login به این شکل میشن(کلیک کنید)؛ در واقع تو این صفحه کاربر اطلاعات خودش اعم از اسم، نام خانوادگی، شغل و جنسیت خودش رو انتخاب میکنه، بعد از کلیک روی دکمه Login به صفحه Profile میره تا اطلاعات نهایی خودش رو ببینه؛ این هم کد های کلاس LoginActivity (کلیک کنید)

3-حالا میرسیم به قسمت جالب ماجرا :)
خب قسمت مهم اینه که اگر قراره از Data Binding استفاده کنید ساختار لایه xml صفحه تون باید همچین ساختاری داشته باشه:

ساختار لایه در زمان استفاده از Data Binding
ساختار لایه در زمان استفاده از Data Binding

صفحه تون باید حتما با layout شروع بشه، و بعد از اون data باشه. data در واقع Data Binding مارو یه جورایی کانفیگ میکنه، چجوری؟ ما به عنوان مقدار type به اون آدرس کلاس person رو میدیم(com.hrkhajeh.databindingsample.Person) و تو قسمت name هم میگیم آقا در صفحه ای که الان درش هستیم(لایوت activity_profile) با اسم person، به همون Data Model اصلی که به این صفحه پاس داده میشه(از طریق Data Binding) دسترسی پیدا کن و اونو شناسایی کن.

پیاده سازی Data Binding در xml صفحه profile
پیاده سازی Data Binding در xml صفحه profile

حالا نوبت میرسه به ربط دادن هر کدوم از متغییر هایی که هنگام ساخت کلاس person ساختیم به ویو هامون(اینجا TextView)؛ با این تیکه کد "{android:text="@{person.personName میگیم آقا متغییر personName دیتا مدل Person هرچی که بود، بیا روی این TextView ستش بکن! یعنی اگر ما در صفحه لاگین قسمت اسم رو با Hamid پر کردیم، اون مقدار رو روی personName یک نمونه از Person ست میکنیم و اونو اینجوری به TextView مون پاس میدیم! کد های تکمیلی xml صفحه activity_profile اینجا(کلیک کنید)

نکته مهم: حتما بعد از تکمیل کردن صفحه activity_profile پروژه رو یک بار ReBuild کنید تا کلاس های مخصوص Data Binding مثل ActivityProfileBinding و متد Binding در سمت جاوا از این صفحه ساخته شوند.

4-بعد از اینکه لایه مون ساخته شد باید تنظیمات صفحه پروفایل رو انجام بدیم؛ روال کار اینجوریه که اول مقادیری که از صفحه لاگین به صفحه پروفایل فرستاده شده(با intent)رو دریافت میکنیم، و سپس اون هارو توی یک نمونه از کلاس person میریزیم(مثلا اسمی که وارد شده رو توی متغییر personName کلاس person میریزیم و باقی موارد نیز به همین منوال)، سپس با استفاده از کد زیر ابتدا لایه xml اکتیویتی پروفایل رو به متد bind کننده مون میدیم، سپس همون person ــی که داریم رو با متد binding و setPerson میدیم به لایه xml(که در نتیجه اون هر مقداری که توی person ست شده میره و داخل View های xml ریخته میشه)
کد های کامل صفحه پروفایل و پیاده سازی Data Binding در ProfileActivity(کلیک کنید)

پیاده سازی Data Binding
پیاده سازی Data Binding

تبریک میگم ! شما موفق شدید در صفحه ProfileActivity بدون حتی یک بار فراخوانی View ها در جاوا، تمامی مقادیرتون رو روی View هاتون ست کنید... نمای کلی از پروژه رو در زیر میبینید:

صفحه لاگین
صفحه لاگین
صفحه پروفایل
صفحه پروفایل


همچنین کد های کامل این پروژه رو میتونید توی GitHub مشاهده کنید.

https://github.com/hamidrezakhajeh/DataBindingSample


برنامه نویسیdata bindingandroidبرنامه نویسی اندرویدjava
توسعه دهنده نرم افزار
شاید از این پست‌ها خوشتان بیاید