آموزش استفاده از ViewBinding در اندروید استودیو ۳٫۶

مدت کوتاهی از ریلیز نسخه ی ۳٫۶٫۱ اندروید استودیو در کانال Stable
میگذرد و این نسخه یک نسخه ی خیلی کامل همراه با ویژگی های خیلی خوب هم از نظر گرافیکی و هم از نظر پرفرمنس هستش که قرار هست با ویژگی جدیدی به نام ViewBinding
که همراه با این نسخه ریلیز شد صحبت کنیم . پس با من همراه باشید .
همه ی ما برنامه نویسان اندروید از نوشتن مداوم findViewById
برای تعریف یک ویو از XML
در زبان جاوا , فراری بودیم و به دنبال راه چاره ایی برای استفاده نکردن از آن بودیم که خیلی از ما به کتابخانه ی سومی به اسم butterknife پناه آوردیم و تا حدودی میتونست ما را راضی نگه دارد ولی بازهم مشکلاتی به همراه داشت .
از خاصیت ktx
کاتلین هم میتونم بگم که ما رو از نوشتن findViewById
راحت کرده ولی خیلی از اوقات داشتن خطای Null
منو رو به شدت اذیت کرده بود چرا که در ران تایم بررسی میشد .
خب رسیدیم به databinding
که بیشتر مشکلات قبلی رو حل و یک سری مشکلات جدید نیز اضافه کرد .
استفاده از دیتابایندینگ فقط برای راحت شدن از دست findViewById
نبود بلکه استفاده های دیگری نیز داشت ولی شلوغ شدن کد , بوجود آمدن مشکلاتی مثل داشتن ارور های کامپایل تایم و ناشناخته خیلی از ماها را اذیت کرده است ولی باز هم استفاده میکردیم .
تا اینکه ویو بایندینگ معرفی شد و اومد که مشکلات دیتابایندینگ رو حل کنه و هم چنین چند قابلیت خوب رو به همراه دارد .
- استفاده نکردن از
findViewById
- هندل کردن نال نبودن ویو ها
- نداشتن ارورهایی در زمان کامپایل کد
- سبکتر و خیلی سریع تر از دیتابایندینگ است
استفاده از آن بسیار ساده و راحت هست فقط کافیست این خط کد را در فایل build.gradle
در تگ android
بنویسید :
1 2 3 |
viewBinding { enabled = true } |
سپس به لایه ی های طراحی مراجعه کنید و به ویو های مد نظر آیدی مناسب اختصاص دهید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version="1.0" encoding="utf-8"?> <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:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/txt_test" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
سپس به سراغ اکتیویتی مد نظر بروید و کد های مربوطه را مثل کد زیر پیاده کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package sanaebadi.info.viewbinding import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.LayoutInflater import android.widget.Toast import sanaebadi.info.viewbinding.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(LayoutInflater.from(th binding = ActivityMainBinding.inflate(LayoutInflater.from(this)))) setContentView(binding.root) binding.txtTest.setOnClickListener{ Toast.makeText(this,"HIIIII , ...." , Toast.LENGTH_SHORT).show() } } } |
همانطور که در کد بالا مشاهده میکنید ActivityMainBinding
کلاسی هست که برای لایه ی ما ساخته شده است . چون نام layout.xml
ایی که قرار هست از خاصیت ویو بایندینگ استفاده کنیم activity_main.xml
هست پس همان نام به صورت بالا نوشته خواهد شد . مثلا اگر لایه ی من به نام activity_about.xml
بود باید ActivityAboutBinding
برای ما ساخته شود .
سپس توسط این خط کد ما لایه ی مورد نظر را به آن متصل میکنیم و به قولی آن را inflate
میکنیم :
1 |
binding = ActivityMainBinding.inflate(LayoutInflater.from(this))ا |
در آخر با استفاده از setContentView
لیوت خود را به آن معرفی کنید :
setContentView(binding.root) |
کار ما در اینجا به اتمام رسید ! اگر قرار هست از آن view
استفاده کنید میتوانید از این تیکه کد استفاده کنید .یعنی با نوشتن binding
(همان نامی که برای نمونه ایی که از کلاس مربوطه ساختید نوشتید) میتوانید به آن ویو دست پیدا کنید . به طور مثال برای این TextView
یک لیسنر ساختم و قرار هست یک Toast
به کاربر نشان دهد :
1 2 3 |
binding.txtTest.setOnClickListener{ Toast.makeText(this,"I am a TextView :)" , Toast.LENGTH_SHORT).show() } |
اگر شما به جای اکتیویتی فرگمنت داشتید فقط کافیست در مرحله ی دوم کد زیر را قرار دهید و توضیحات همانند توضیحات اکتیویتی هست با این تفاوت که ما در اینجا وروردی های دیگری را به آن پاس خواهیم داد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import sanaebadi.info.viewbinding.databinding.ActivityMainBinding import sanaebadi.info.viewbinding.databinding.FragmentMainBinding /** * A simple [Fragment] subclass. */ class MainFragment : Fragment() { private lateinit var binding: FragmentMainBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment binding=FragmentMainBinding.inflate(inflater,container,false) val view=binding.root return view } override fun onDestroy() { super.onDestroy() binding=null!! } } |
و برای رعایت lifeCycle
در فرگمنت کافیست متد onDestroy
را صدا بزنید و نمونه ی ساخته شده برای ویو بایندینگ را برابر null
قرار دهید .
این بود تعریف viewBinding
و نیز استفاده از آن در اکتیویتی و فرگمنت ! کد های بالا را در یک پروژه کوچکی تعریف کردم که به مرور کاملتر خواهد شد می توانید به آن مراجعه کنید .
امیدوارم از این مقاله برای شما مفید واقع بشه ، خوشحال خواهم شد اگر دیدگاه های ارزشمند خودتون رو برای ما ارسال کنید.

درباره اندروید راست چین
با بیش از 10 سال کد نویسی در تمام پلتفرم ها
نوشته های بیشتر از اندروید راست چین
دیدگاهتان را بنویسید