آموزش view binding در اندروید - بای بای findViewById:)

با خودمون که تعارف نداریم . برنامه نویس ها ادم های تنبلی هستند. نه به این معنا که حوصله ندارن اشغال هارو ببرن دم در(که این طور هم هست) بلکه به این معنا که دوست ندارن زیاد از کد های تکراری ایستفاده کنند. این یکی از اصول برنامه نویسیه. در اندروید هر وقت میخواهیم از یک view استفاده کنیم مجبوریم اول با متدfindViewById اون رو پیدا کنیم. اما گوگل توی کنفرانس I/O اخیر ویژگی رو معرفی کرد که مارو از شر این ها راحت میکنه. اسمش هست : view binding. این رو با bata binding اشتباه نگیرید . میشه گفت view binding اومده تا استفاده از data binding رو برای استفاده های خاص اسون کنه. کاربرد اصلیش بی نیاز کردن ما از findViewById است.البته تا اونجا که من میدونم در کاتلین هم ویژگی های مشابهی وجود داره که جایگزین بهتری برایfindViewById است ولی این موضوع بحث ما نیست. برای اینکه از این ویژگی استفاده کنید باید اندروید استودیو ۳٫۶ به بالا رو نصب کنید و حتما gradle رو اپدیت کنید.اول برید توی فایل gradle.build مربوط به ماژول app و این خط هارو اضافه کنید.وقتی پروژه سینک شد باید به ازای هر لایه(layout), یک کلاس ایجاد شده باشد. اسم این کلاس از اسم لایه که به هم چسبیده شده(با قاعده camel case) و کلمه Binding در انتها اون تشکیل شده. به این کلاس binding class گفته میشه.فرض کنید یک لایه به اسم result_profile داریم:اسم binding class اون لایه میشه ResultProfileBinding که دو تا فیلد داره: یکTextView به اسم name و یک Button به اسم button . و ImageView چون آی دی نداره پس فیلدی هم ازش نیست.در این کلاس از هر view ای که آی دی داشته باشد یک ارجاع وجود داره. انگار اندروید همه view ها رو برامون پیدا کرده و ما فقط باید ازش استفاده کنیم. اما استفاده از اون هم قوانین خودشو داره.در ضمن در این کلاس یک متد استاتیک به نام getRoot هم وجود داره که root element( یا rootView) اون لایه رو برمیگردونه( تگی که بقیه تگ ها در اون قرار میگیره . در مثال بالا LinearLayout).استفاده از view binding در اکتیویتی:برای اینکه یک شی از binding class ایجاد کنیم و از اون توی اکتیویتی استفاده کنیم مراحل زیر را دنبال کنید.متد استاتیک inflate را روی binding class مورد نظر اجرا کنید تا یک شی از اون binding class در اختیارتون قرار بگیره.یک شی از root element یا rootView (که در بالا بهش اشاره شد) رو از طریق متد getRoot بگیرید.اون شی رو به متد setContentView بدید.الان میتونید از این شی در اکتیویتی استفاده کنید.استفاده از view binding در فرگمنت:برای اینکه یک شی از binding class ایجاد کنیم و از اون توی فرگمنت استفاده کنیم مراحل زیر را دنبال کنید.متد استاتیک inflate را روی binding class مورد نظر اجرا کنید تا یک شی از اون binding class در اختیارتون قرار بگیره.یک شی از root element یا rootView (که در بالا بهش اشاره شد) رو از طریق متد getRoot بگیرید.اون شی رو به عنوان مقدار برگشتی onCreateView قرار بدید.مزایا استفاده از view binding در برابر findViewById:ایمنی در برابر null بودن: با استفاده از view binding یک ارجاع به همه view ایجاد میشه و خطر اشتباه بودن آی دی و null pointer exception از بین میره.فیلد هایی که در binding class ایجاد میشه از جنس همون چیزی هستند که توی فایل xml وجود داره. مثلا یک Button در لایه, به صورت یک شی Button در binding class وجود داره. پس خطر class cast exception از بین میره.این بود مقدمات view binding . امیدوارم مفید واقع بشه. سعی کردم کامل باشه. خیلی جاها مجبور شدم از کلمات انگلیسی استفاده کنم چون نتونستم معادل مناسبی براش پیدا کنم.جدیدا توی هر پستی که میزارم یه تبلیغی از پروژه ای که تازه شروع کردم میکنم:)تصمیم گرفتیم که کتاب clean code رو خودمون ترجمه کنیم و برای استفاده عموم منتشر کنیم. فصل اول کتاب ترجمه شده و میتونید اونو توی گیت هاب ما ببینید و اگر دوست داشتید کمک کنید پست زیر برای شما مفید خواهد بود. لازم نیست کل وقت تونو بذارید . یک صفحه هم خوبه. https://virgool.io/@dndshmdr/%D8%A8%DB%8C%D8%A7%DB%8C%D9%86-%DA%A9%D8%AA%D8%A7%D8%A8-clean-code-%D8%B1%D8%A7-%D8%A8%D8%A7-%D9%87%D9%85-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%DA%A9%D9%86%DB%8C%D9%85-nzjvkcf2sckr