溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ViewBinding怎么使用

發(fā)布時間:2023-03-20 11:43:53 來源:億速云 閱讀:285 作者:iii 欄目:開發(fā)技術

本文小編為大家詳細介紹“ViewBinding怎么使用”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“ViewBinding怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    視圖綁定

    通過視圖綁定功能,您可以更輕松地編寫可與視圖交互的代碼。在模塊中啟用視圖綁定之后,系統(tǒng)會為該模塊中的每個 XML 布局文件生成一個綁定類。綁定類的實例包含對在相應布局中具有 ID 的所有視圖的直接引用。
    在大多數(shù)情況下,視圖綁定會替代 findViewById。

    設置說明

    注意:視圖綁定在 Android Studio 3.6 Canary 11 及更高版本中可用。

    視圖綁定功能可按模塊啟用。要在某個模塊中啟用視圖綁定,請將 viewBinding 元素添加到其 build.gradle 文件中,如下例所示:

    android {
        ...
        viewBinding {
            enabled = true
        }
    }

    然而,在后續(xù)的as版本中這個引用又變了,不然build可能報錯,需要如下引用才行:

    android {
    	buildFeatures{
    		viewBinding true
    	}
    }

    如果您希望在生成綁定類時忽略某個布局文件,請將 tools:viewBindingIgnore=“true” 屬性添加到相應布局文件的根視圖中:

    <LinearLayout
            ...
            tools:viewBindingIgnore="true" >
        ...
    </LinearLayout>

    用法

    為某個模塊啟用視圖綁定功能后,系統(tǒng)會為該模塊中包含的每個 XML 布局文件生成一個綁定類。每個綁定類均包含對根視圖以及具有 ID 的所有視圖的引用。系統(tǒng)會通過以下方式生成綁定類的名稱:將 XML 文件的名稱轉(zhuǎn)換為駝峰式大小寫,并在末尾添加“Binding”一詞。

    例如,假設某個布局文件的名稱為 result_profile.xml

    <LinearLayout ... >
            <TextView android:id="@+id/name" />
            <ImageView android:cropToPadding="true" />
            <Button android:id="@+id/button"
                android:background="@drawable/rounded_button" />
        </LinearLayout>

    所生成的綁定類的名稱就為 ResultProfileBinding。此類具有兩個字段:一個是名為 nameTextView,另一個是名為 buttonButton。該布局中的 ImageView 沒有 ID,因此綁定類中不存在對它的引用。

    每個綁定類還包含一個 getRoot() 方法,用于為相應布局文件的根視圖提供直接引用。在此示例中,ResultProfileBinding 類中的 getRoot() 方法會返回 LinearLayout 根視圖。

    以下幾個部分介紹了生成的綁定類在 Activity 和 Fragment 中的使用。

    在 Activity 中使用視圖綁定

    如需設置綁定類的實例以供 Activity 使用,請在 Activity 的 onCreate() 方法中執(zhí)行以下步驟:

    • 調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法。此操作會創(chuàng)建該綁定類的實例以供 Activity 使用。

    • 通過調(diào)用 getRoot() 方法或使用 Kotlin 屬性語法獲取對根視圖的引用。

    • 將根視圖傳遞到 setContentView(),使其成為屏幕上的活動視圖。

       private lateinit var binding: ResultProfileBinding
    
       override fun onCreate(savedInstanceState: Bundle) {
           super.onCreate(savedInstanceState)
           binding = ResultProfileBinding.inflate(layoutInflater)
           val view = binding.root
           setContentView(view)
       }

    您現(xiàn)在即可使用該綁定類的實例來引用任何視圖:

        binding.name.text = viewModel.name
        binding.button.setOnClickListener { viewModel.userClicked() }

    在 Fragment 中使用視圖綁定

    如需設置綁定類的實例以供 Fragment 使用,請在 Fragment 的 onCreateView() 方法中執(zhí)行以下步驟:

    • 調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法。此操作會創(chuàng)建該綁定類的實例以供 Fragment 使用。

    • 通過調(diào)用 getRoot() 方法或使用 Kotlin 屬性語法獲取對根視圖的引用。

    • 從 onCreateView() 方法返回根視圖,使其成為屏幕上的活動視圖。

    注意:inflate() 方法會要求您傳入布局膨脹器。如果布局已膨脹,您可以調(diào)用綁定類的靜態(tài) bind() 方法。如需了解詳情,請查看視圖綁定 GitHub 示例中的例子。

        private var _binding: ResultProfileBinding? = null
        // This property is only valid between onCreateView and
        // onDestroyView.
        private val binding get() = _binding!!
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            _binding = ResultProfileBinding.inflate(inflater, container, false)
            val view = binding.root
            return view
        }
    
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }

    您現(xiàn)在即可使用該綁定類的實例來引用任何視圖:

        binding.name.text = viewModel.name
        binding.button.setOnClickListener { viewModel.userClicked() }

    注意:Fragment 的存在時間比其視圖長。請務必在 Fragment 的 onDestroyView() 方法中清除對綁定類實例的所有引用。

    GitHub示例如下代碼所示:

    class BindFragment : Fragment(R.layout.fragment_blank) {
    
        // Scoped to the lifecycle of the fragment's view (between onCreateView and onDestroyView)
        private var fragmentBlankBinding: FragmentBlankBinding? = null
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            val binding = FragmentBlankBinding.bind(view)
            fragmentBlankBinding = binding
            binding.textViewFragment.text = getString(string.hello_from_vb_bindfragment)
        }
    
        override fun onDestroyView() {
            // Consider not storing the binding instance in a field, if not needed.
            fragmentBlankBinding = null
            super.onDestroyView()
        }
    }

    與 findViewById 的區(qū)別

    與使用 findViewById 相比,視圖綁定具有一些很顯著的優(yōu)點:

    • Null 安全:由于視圖綁定會創(chuàng)建對視圖的直接引用,因此不存在因視圖 ID 無效而引發(fā) Null 指針異常的風險。此外,如果視圖僅出現(xiàn)在布局的某些配置中,則綁定類中包含其引用的字段會使用 @Nullable 標記。

    • 類型安全:每個綁定類中的字段均具有與它們在 XML 文件中引用的視圖相匹配的類型。這意味著不存在發(fā)生類轉(zhuǎn)換異常的風險。

    這些差異意味著布局和代碼之間的不兼容將會導致構建在編譯時(而非運行時)失敗。

    與數(shù)據(jù)綁定的對比

    視圖綁定和數(shù)據(jù)綁定均會生成可用于直接引用視圖的綁定類。但是,視圖綁定旨在處理更簡單的用例,與數(shù)據(jù)綁定相比,具有以下優(yōu)勢:

    • 更快的編譯速度:視圖綁定不需要處理注釋,因此編譯時間更短。

    • 易于使用:視圖綁定不需要特別標記的 XML 布局文件,因此在應用中采用速度更快。在模塊中啟用視圖綁定后,它會自動應用于該模塊的所有布局。

    反過來,與數(shù)據(jù)綁定相比,視圖綁定也具有以下限制:

    • 視圖綁定不支持布局變量或布局表達式,因此不能用于直接在 XML 布局文件中聲明動態(tài)界面內(nèi)容。

    • 視圖綁定不支持雙向數(shù)據(jù)綁定。

    考慮到這些因素,在某些情況下,最好在項目中同時使用視圖綁定和數(shù)據(jù)綁定。您可以在需要高級功能的布局中使用數(shù)據(jù)綁定,而在不需要高級功能的布局中使用視圖綁定。

    讀到這里,這篇“ViewBinding怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內(nèi)容的文章,歡迎關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI