سورس آماده فروشگاه اینترنتی با امکانات ویژه

آموزش استفاده از ViewBinding در اندروید استودیو 3.6

اسفند 17, 1398| سنا عبادی
آموزش ویوبایندینگ در اندروید استدیو | وبلاگ مارکت سورس اندروید ریورض

مدت کوتاهی از ریلیز نسخه ی 3.6.1 اندروید استودیو در کانال Stable میگذرد و این نسخه یک نسخه ی خیلی کامل همراه با ویژگی های خیلی خوب هم از نظر گرافیکی و هم از نظر پرفرمنس هستش که قرار هست با ویژگی جدیدی به نام ViewBinding که همراه با این نسخه ریلیز شد صحبت کنیم . پس با من همراه باشید .

همه ی ما برنامه نویسان اندروید از نوشتن مداوم findViewById برای تعریف یک ویو از XML در زبان جاوا , فراری بودیم و به دنبال راه چاره ایی برای استفاده نکردن از آن بودیم که خیلی از ما به کتابخانه ی سومی به اسم butterknife پناه آوردیم و تا حدودی میتونست ما را راضی نگه دارد ولی بازهم مشکلاتی به همراه داشت .

از خاصیت ktx کاتلین هم میتونم بگم که ما رو از نوشتن findViewById راحت کرده ولی خیلی از اوقات داشتن خطای Null منو رو به شدت اذیت کرده بود چرا که در ران تایم بررسی میشد .

خب رسیدیم به databinding که بیشتر مشکلات قبلی رو حل و یک سری مشکلات جدید نیز اضافه کرد .

استفاده از دیتابایندینگ فقط برای راحت شدن از دست findViewById نبود بلکه استفاده های دیگری نیز داشت ولی شلوغ شدن کد , بوجود آمدن مشکلاتی مثل داشتن ارور های کامپایل تایم و ناشناخته خیلی از ماها را اذیت کرده است ولی باز هم استفاده میکردیم .

تا اینکه ویو بایندینگ معرفی شد و اومد که مشکلات دیتابایندینگ رو حل کنه و هم چنین چند قابلیت خوب رو به همراه دارد .

  1. استفاده نکردن از findViewById
  2. هندل کردن نال نبودن ویو ها
  3. نداشتن ارورهایی در زمان کامپایل کد
  4. سبکتر و خیلی سریع تر از دیتابایندینگ است
همچنین بخوانید :  ویژگی های یک اپلیکیشن موفق موبایل چیست ؟

استفاده از آن بسیار ساده و راحت هست فقط کافیست این خط کد را در فایل build.gradle در تگ android بنویسید :

  viewBinding {
        enabled = true
    }

سپس به لایه ی های طراحی مراجعه کنید و به ویو های مد نظر آیدی مناسب اختصاص دهید :

<?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>

سپس به سراغ اکتیویتی مد نظر بروید و کد های مربوطه را مثل کد زیر پیاده کنید :

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(this))
       
 setContentView(binding.root)
        binding.txtTest.setOnClickListener{
            Toast.makeText(this,"I am a TextView :)" , Toast.LENGTH_SHORT).show()
        }
    }
}

همانطور که در کد بالا مشاهده میکنید ActivityMainBinding کلاسی هست که برای لایه ی ما ساخته شده است . چون نام layout.xml ایی که قرار هست از خاصیت ویو بایندینگ استفاده کنیم activity_main.xml هست پس همان نام به صورت بالا نوشته خواهد شد . مثلا اگر لایه ی من به نام activity_about.xml بود باید ActivityAboutBinding برای ما ساخته شود .

سپس توسط این خط کد ما لایه ی مورد نظر را به آن متصل میکنیم و به قولی آن را inflate میکنیم :

  binding = ActivityMainBinding.inflate(LayoutInflater.from(this))ا

در آخر با استفاده از setContentView لیوت خود را به آن معرفی کنید :

  setContentView(binding.root)

کار ما در اینجا به اتمام رسید ! اگر قرار هست از آن view استفاده کنید میتوانید از این تیکه کد استفاده کنید .یعنی با نوشتن binding (همان نامی که برای نمونه ایی که از کلاس مربوطه ساختید نوشتید) میتوانید به آن ویو دست پیدا کنید . به طور مثال برای این TextView یک لیسنر ساختم و قرار هست یک Toast به کاربر نشان دهد :

binding.txtTest.setOnClickListener{
            Toast.makeText(this,"I am a TextView :)" , Toast.LENGTH_SHORT).show()
        }

اگر شما به جای اکتیویتی فرگمنت داشتید فقط کافیست در مرحله ی دوم کد زیر را قرار دهید و توضیحات همانند توضیحات اکتیویتی هست با این تفاوت که ما در اینجا وروردی های دیگری را به آن پاس خواهیم داد :

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 قرار دهید .

همچنین بخوانید :  حل مشکل Unfortunately, App has stopped

این بود تعریف viewBinding و نیز استفاده از آن در اکتیویتی و فرگمنت ! کد های بالا را در یک پروژه کوچکی تعریف کردم که به مرور کاملتر خواهد شد می توانید به آن مراجعه کنید .

https://github.com/androidriverir/ViewBinding-3.6

امیدوارم از این مقاله برای شما مفید واقع بشه ، خوشحال خواهم شد اگر دیدگاه های ارزشمند خودتون رو برای ما ارسال کنید.

سنا عبادی نویسنده مقاله

توسعه دهنده موبایل به ویژه سیستم عامل اندروید ، هم بنیانگذار اندروید ریور و در تلاش برای تحقق یک رویا..



می تونی سنا عبادی رو توی شبکه های اجتماعی هم دنبال کنی ...

مقالات مرتبط را بخوانید :


سورس های اندروید شامل تخفیف رو ببین !

به این مقاله امتیاز دهید :
5/5 (1 Review)
  خرید سورس های حرفه ای بازی و اپلیکیشن اندروید

  تخفیف ها و اخبار ویژه رو در تلگراممون دنبال کن :)

دسته‌ها: آموزش برنامه نویسی اندروید

دیدگاه

  • Arsalan Salehi
    اسفند 19, 1398

    ممنون از پست بروزتون. کاش تفاوتش با dataBinding هم گفته بودید چون این دوتا خیلی نزدیک هستن.
    دلیل خاصی داشت که بجای
    binding = ActivityMainBinding.inflate(layoutInflater)
    از
    binding = ActivityMainBinding.inflate(LayoutInflater.from(th binding = ActivityMainBinding.inflate(LayoutInflater.from(this))))
    استفاده کردید؟

  • سنا عبادی
    اسفند 19, 1398

    سلام
    تفاوت های بولد اشو نوشتم . با دیتا بایندینگ میشد خیلی کارا کرد ولی ویو بایندینگ محدودیت هایی داره ولی عملکردش نسبت به اون در inflate کردن بهتر هست . هم سبکتر هست هم اون خطاهای سرسام اوری که در دیتا بایندینگ موقع اجرا پروژه داشتیم رو نداریم .
    متاسفانه کد اشتباهیی در وبلاگ چاپ شده و من الان ادیت زدم . همون خط اولی درسته . دوباره به کد نگاه کنید درست شده .
    ممنون از حمایت شما

  • Amin Vali
    اسفند 20, 1398

    ممنون از مطلب خوبتون
    چطور می‌شه از viewBinding توی recyclerView و viewHolder استفاده کرد؟

    • سنا عبادی
      اسفند 29, 1398

      سلام
      خیر . اون دیتا بایندینگ هست . ویو بایندینگ فقط برای اینفلیت کردن ویو ها در کاتلین هست .
      به این لینک مراجعه کنید و در اخر نوشته دو لینک مفید هست .

      https://developer.android.com/topic/libraries/view-binding

  • Rasool Fazeli
    اردیبهشت 7, 1399

    عذر میخوام شما میدونید چطور میشه همزمان از viewBinding و dataBinding در یک پروژه استفاده کرد ؟

    من هنوز متوجه نشدم که viewBinding و dataBinding مکمل همدیگه هستن یا viewBinding یه مبحث جدیده و جایگزین dataBinding شده و اون رو منسوخ میکنه ؟

دیدگاهتان را بنویسید

راهنما : برای نوشتن موارد مختلف در دیدگاه می توانید از راهنمای نگارش اندروید ریور استفاده کنید : نگارش کد کوتاه `your code`
نگارش کد بلند یا نگارش بخش عمده یک سورس کد :
[sourcecode lang="your code language"] your code here [/sourcecode]