Android View Binding的使用

一、前言:

1尽楔、視圖綁定

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

2婴梧、設(shè)置說明

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

視圖綁定功能可按模塊啟用。要在某個(gè)模塊中啟用視圖綁定塞蹭,請(qǐng)將 viewBinding 元素添加到其 build.gradle 文件中孽江,如下例所示:

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

如果您希望在生成綁定類時(shí)忽略某個(gè)布局文件,請(qǐng)將 tools:viewBindingIgnore="true" 屬性添加到相應(yīng)布局文件的根視圖中:

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

二浮还、使用:

1竟坛、用法

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

例如崭歧,假設(shè)某個(gè)布局文件的名稱為 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。此類具有兩個(gè)字段:一個(gè)是名為 name 的 TextView撞牢,另一個(gè)是名為 button 的 Button率碾。該布局中的 ImageView 沒有 ID,因此綁定類中不存在對(duì)它的引用屋彪。

每個(gè)綁定類還包含一個(gè) getRoot() 方法所宰,用于為相應(yīng)布局文件的根視圖提供直接引用。在此示例中畜挥,ResultProfileBinding 類中的 getRoot() 方法會(huì)返回 LinearLayout 根視圖仔粥。

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

2蟹但、在 Activity 中使用視圖綁定

如需設(shè)置綁定類的實(shí)例以供 Activity 使用躯泰,請(qǐng)?jiān)?Activity 的 onCreate() 方法中執(zhí)行以下步驟:

  1. 調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法。此操作會(huì)創(chuàng)建該綁定類的實(shí)例以供 Activity 使用华糖。
  2. 通過調(diào)用 getRoot() 方法或使用 Kotlin 屬性語法獲取對(duì)根視圖的引用麦向。
  3. 將根視圖傳遞到 setContentView(),使其成為屏幕上的活動(dòng)視圖客叉。
    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)在即可使用該綁定類的實(shí)例來引用任何視圖:

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

3灶体、 在 Fragment 中使用視圖綁定

如需設(shè)置綁定類的實(shí)例以供 Fragment 使用,請(qǐng)?jiān)?Fragment 的 onCreateView() 方法中執(zhí)行以下步驟:

  1. 調(diào)用生成的綁定類中包含的靜態(tài) inflate() 方法搀军。此操作會(huì)創(chuàng)建該綁定類的實(shí)例以供 Fragment 使用嗅绰。
  2. 通過調(diào)用 getRoot() 方法或使用 Kotlin 屬性語法獲取對(duì)根視圖的引用。
  3. onCreateView() 方法返回根視圖向族,使其成為屏幕上的活動(dòng)視圖呵燕。

注意inflate() 方法會(huì)要求您傳入布局膨脹器。如果布局已膨脹件相,您可以調(diào)用綁定類的靜態(tài) bind() 方法再扭。如需了解詳情,請(qǐng)查看視圖綁定 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)在即可使用該綁定類的實(shí)例來引用任何視圖:

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

注意:Fragment 的存在時(shí)間比其視圖長泛范。請(qǐng)務(wù)必在 Fragment 的 onDestroyView() 方法中清除對(duì)綁定類實(shí)例的所有引用

4、 與 findViewById 的區(qū)別

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

  • Null 安全:由于視圖綁定會(huì)創(chuàng)建對(duì)視圖的直接引用罢荡,因此不存在因視圖 ID 無效而引發(fā) Null 指針異常的風(fēng)險(xiǎn)。此外,如果視圖僅出現(xiàn)在布局的某些配置中区赵,則綁定類中包含其引用的字段會(huì)使用 @Nullable 標(biāo)記惭缰。
  • 類型安全:每個(gè)綁定類中的字段均具有與它們?cè)?XML 文件中引用的視圖相匹配的類型。這意味著不存在發(fā)生類轉(zhuǎn)換異常的風(fēng)險(xiǎn)笼才。

這些差異意味著布局和代碼之間的不兼容將會(huì)導(dǎo)致構(gòu)建在編譯時(shí)(而非運(yùn)行時(shí))失敗漱受。

5、 與數(shù)據(jù)綁定的對(duì)比

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

  • 更快的編譯速度:視圖綁定不需要處理注釋虐先,因此編譯時(shí)間更短。
  • 易于使用:視圖綁定不需要特別標(biāo)記的 XML 布局文件派敷,因此在應(yīng)用中采用速度更快蛹批。在模塊中啟用視圖綁定后,它會(huì)自動(dòng)應(yīng)用于該模塊的所有布局膀息。

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

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


https://developer.android.google.cn/topic/libraries/view-binding

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弱判,隨后出現(xiàn)的幾起案子襟沮,更是在濱河造成了極大的恐慌,老刑警劉巖昌腰,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件开伏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遭商,警方通過查閱死者的電腦和手機(jī)固灵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劫流,“玉大人巫玻,你說我怎么就攤上這事丛忆。” “怎么了仍秤?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵熄诡,是天一觀的道長。 經(jīng)常有香客問我徒扶,道長粮彤,這世上最難降的妖魔是什么根穷? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任姜骡,我火速辦了婚禮,結(jié)果婚禮上屿良,老公的妹妹穿的比我還像新娘圈澈。我一直安慰自己,他們只是感情好尘惧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布康栈。 她就那樣靜靜地躺著,像睡著了一般喷橙。 火紅的嫁衣襯著肌膚如雪啥么。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天贰逾,我揣著相機(jī)與錄音悬荣,去河邊找鬼。 笑死疙剑,一個(gè)胖子當(dāng)著我的面吹牛氯迂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播言缤,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嚼蚀,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了管挟?” 一聲冷哼從身側(cè)響起轿曙,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僻孝,沒想到半個(gè)月后导帝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皮璧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年舟扎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悴务。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睹限,死狀恐怖譬猫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羡疗,我是刑警寧澤染服,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站叨恨,受9級(jí)特大地震影響柳刮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痒钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一秉颗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧送矩,春花似錦蚕甥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晌块,卻和暖如春爱沟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匆背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工呼伸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靠汁。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓蜂大,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝶怔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奶浦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容