深入解析 androidx.databinding.Bindable 注解

在這里插入圖片描述

在現代 Android 開發中,數據綁定 (Data Binding) 是一個非常重要的技術。它使得我們能夠簡化 UI 和業務邏輯之間的連接,從而提高代碼的可讀性和維護性。在數據綁定中,@Bindable 注解是一個關鍵部分,它幫助我們實現雙向數據綁定和自動更新視圖。本文將深入解析 androidx.databinding.Bindable 注解的使用和原理。

什么是 @Bindable 注解?

@Bindable 注解用于標記一個屬性,使得這個屬性可以被數據綁定框架觀察。當這個屬性的值發生變化時,數據綁定框架會自動更新相關的 UI 視圖。這個注解通常與 BaseObservable 類或 Observable 接口一起使用。

基本用法

創建一個綁定類

首先,我們需要創建一個繼承自 BaseObservable 的類,并在需要綁定的屬性上添加 @Bindable 注解。例如,我們創建一個 User 類來演示數據綁定:

import androidx.databinding.BaseObservable
import androidx.databinding.Bindableclass User : BaseObservable() {var firstName: String = ""@Bindable get() = fieldset(value) {field = valuenotifyPropertyChanged(BR.firstName)}var lastName: String = ""@Bindable get() = fieldset(value) {field = valuenotifyPropertyChanged(BR.lastName)}
}

在布局文件中使用數據綁定

接下來,我們需要在布局文件中使用數據綁定。我們需要在根布局中添加 layout 標簽,并啟用數據綁定:

<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="user"type="com.example.app.User" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={user.firstName}" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={user.lastName}" /></LinearLayout>
</layout>

在 Activity 或 Fragment 中綁定數據

最后,我們需要在 ActivityFragment 中綁定數據并設置視圖模型:

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.app.databinding.ActivityMainBindingclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)val user = User().apply {firstName = "John"lastName = "Doe"}binding.user = user}
}

深入理解 @Bindable 的工作原理

自動生成的 BR 類

當我們在屬性上添加 @Bindable 注解時,數據綁定框架會自動生成一個 BR 類。這個類包含了所有綁定屬性的 ID,用于在屬性值變化時通知數據綁定框架。例如,BR.firstNameBR.lastName 就是自動生成的 ID。

object BR {@JvmFieldval _all = 0@JvmFieldval firstName = 1@JvmFieldval lastName = 2
}

notifyPropertyChanged 方法

notifyPropertyChanged 方法用于通知數據綁定框架某個屬性的值發生了變化。我們需要在屬性的 setter 方法中調用它,并傳遞相應的屬性 ID。例如:

var firstName: String = ""@Bindable get() = fieldset(value) {field = valuenotifyPropertyChanged(BR.firstName)}

這樣,當 firstName 的值變化時,數據綁定框架會自動更新所有綁定了 firstName 的視圖。

高級用法

雙向數據綁定

雙向數據綁定允許我們在視圖和數據模型之間實現雙向同步。例如,當用戶在 EditText 中輸入文本時,數據模型會自動更新;同樣,當數據模型的值發生變化時,視圖也會自動更新。我們可以通過在 XML 中使用 @= 語法來實現雙向數據綁定:

<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@={user.firstName}" />

自定義屬性和 BindingAdapter

有時候,我們需要在視圖上綁定一些自定義屬性。為此,我們可以使用 BindingAdapter 注解來自定義數據綁定邏輯。例如,我們可以為 ImageView 創建一個自定義綁定適配器,用于加載網絡圖片:

import android.widget.ImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glideobject BindingAdapters {@JvmStatic@BindingAdapter("imageUrl")fun loadImage(view: ImageView, url: String?) {if (!url.isNullOrEmpty()) {Glide.with(view.context).load(url).into(view)}}
}

在布局文件中使用自定義屬性:

<ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:imageUrl="@{viewModel.imageUrl}" />

性能優化

在使用數據綁定時,我們需要注意性能優化,特別是在大型項目中。以下是一些常見的優化建議:

使用 ObservableField

對于簡單的單個字段綁定,可以使用 ObservableField 來代替 @Bindable 注解和 BaseObservable,這樣可以減少代碼量并提高性能:

import androidx.databinding.ObservableFieldclass User {val firstName = ObservableField<String>()val lastName = ObservableField<String>()
}

避免過度綁定

綁定的數據越多,數據綁定框架的開銷就越大。盡量只綁定必要的數據,避免不必要的綁定和數據刷新。

結論

@Bindable 注解是 Android 數據綁定框架中的一個關鍵部分,通過它可以實現數據和視圖的雙向綁定,從而簡化代碼結構,提高代碼的可維護性。通過本文的介紹,相信你已經對 @Bindable 注解的基本用法、高級用法和性能優化有了更深入的了解。在實際開發中,合理使用 @Bindable 和數據綁定框架,可以大大提升開發效率和應用的用戶體驗。

Best regards!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42011.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42011.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Doris的分區與分桶原理解析

介紹 在 Apache Doris 中,“分區”和“分桶”是兩種用于管理和優化數據的技術,分別解決不同的數據存儲和查詢優化問題。 在 Doris 中,數據都以表(Table)的形式進行邏輯上的描述。 Row & Column 一張表包括行(Row)和列(Column): Row:即用戶的一行數據; Colu…

redis7新特性、源碼解析

版本&#xff1a;第2位版本號為奇數是非穩定版&#xff0c;偶數才是穩定版本https://download.redis.io/releases/ redis7新特性 multi-AOF: 7之前的版本AOF只有一個文件&#xff0c;現在有多個處于同一目錄的AOF文件RDB文件格式更新&#xff0c;不兼容老版本的RDB格式redis …

【車載開發系列】GIT安裝詳細教程

【車載開發系列】GIT安裝詳細教程 【車載開發系列】GIT安裝詳細教程 【車載開發系列】GIT安裝詳細教程一. GIT軟件概念二. GIT安裝步驟三. GIT安裝確認三. GIT功能使用1&#xff09;Git Bash2&#xff09;Git CMD3&#xff09;Git FAQs4&#xff09;Git GUI 一. GIT軟件概念 G…

數據庫系統原理 | 查詢作業1

整理自博主本科《數據庫系統原理》專業課自己完成的實驗課查詢作業&#xff0c;以便各位學習數據庫系統概論的小伙伴們參考、學習。 *文中若存在書寫不合理的地方&#xff0c;歡迎各位斧正。 專業課本&#xff1a; ? ———— 本次實驗使用到的圖形化工具&#xff1a;Heidisql…

云端AI大模型群體智慧后臺架構思考

1 大模型的調研 1.1 主流的大模型 openai-chatgpt 阿里巴巴-通義千問 一個專門響應人類指令的大模型。我是效率助手&#xff0c;也是點子生成機&#xff0c;我服務于人類&#xff0c;致力于讓生活更美好。 百度-文心一言&#xff08;千帆大模型&#xff09; 文心一言"…

MySQL基礎篇(三)數據庫的修改 刪除 備份恢復 查看連接情況

對數據庫的修改主要指的是修改數據庫的字符集&#xff0c;校驗規則。 將test1數據庫字符集改為gbk。 數據庫的刪除&#xff1a; 執行完該數據庫就不存在了&#xff0c;對應數據庫文件夾被刪除&#xff0c;級聯刪除&#xff0c;里面的數據表全部被刪除。 注意&#xff1a;不要隨…

淺識Jmeter與淺談互聯網公司高并發業務壓測流程痛點

淺談Jmeter 什么是Jmeter JMeter 是 Apache 軟件基金會開發的一個開源軟件&#xff0c;用于負載測試和性能測試。它被設計用來模擬多種請求到服務器、網絡或對象&#xff0c;以測試其性能。JMeter 可以用于測試靜態和動態資源&#xff0c;并且可以模擬各種協議的請求&#xf…

NDVI數據集提取植被覆蓋度FVC

植被覆蓋度FVC 植被覆蓋度&#xff08;Foliage Vegetation Cover&#xff0c;FVC&#xff09;是指植被冠層覆蓋地表的面積比例&#xff0c;通常用來描述一個區域內植被的茂密程度或生長狀況。它是生態學、環境科學以及地理信息系統等領域的重要指標&#xff0c;對于理解地表能…

絕區叁--如何在移動設備上本地運行LLM

隨著大型語言模型 (LLM)&#xff08;例如Llama 2和Llama 3&#xff09;不斷突破人工智能的界限&#xff0c;它們正在改變我們與周圍技術的互動方式。這些模型早已集成到我們的手機中&#xff0c;但到目前為止&#xff0c;它們理解和處理請求的能力還非常有限。然而&#xff0c;…

手寫實現一個ORM框架

手寫實現一個ORM框架 什么是ORM框架、ORM框架的作用效果演示框架設計代碼細節SqlBuilderSqlExecutorStatementHandlerParameterHandlerResultSetHandler逆序生成實體類 大家好&#xff0c;本人最近寫了一個ORM框架&#xff0c;想在這里分享給大家&#xff0c;讓大家來學習學習。…

leetcode力扣_排序問題

215.數組中的第K個最大元素 鑒于已經將之前學的排序算法忘得差不多了&#xff0c;只會一個冒泡排序法了&#xff0c;就寫了一個冒牌排序法&#xff0c;將給的數組按照降序排列&#xff0c;然后取nums[k-1]就是題目要求的&#xff0c;但是提交之后對于有的示例顯示”超出時間限制…

JavaWeb開發之環境準備-大合集

本文博客地址 JavaWeb開發 || 環境準備 1. 前言2. JDK8安裝2.1 下載地址2.2 安裝配置圖示2.2.1 JDK安裝2.2.2 配置系統環境變量 3. Maven安裝3.1 Maven下載3.2 Maven解壓及系統變量配置 4. Tomcat安裝4.1 Tomcat下載4.2 Tomcat解壓及系統變量配置 5. Redis安裝5.1 Redis下載5.…

記錄一次麒麟V10 安裝sysbench各種報錯(關于MySQL)處理過程

sysbench手工下載&#xff1a; https://github.com/akopytov/sysbench 下載.zip文件&#xff0c;上傳到服務器上 解壓、安裝&#xff1a; unzip sysbench-master.zipcd sysbench-master/sh autogen.sh./configure 報錯&#xff1a;沒有mysql驅動 configure: error: mysql_c…

Marin說PCB之CAM350的軟件使用知多少?

今天上海的氣溫那叫一個高啊&#xff0c;溫度都達到了39左右了都&#xff0c;我都嚴重懷疑我不是在魔都上班而是在火焰山板磚去了。這么燥熱的天氣真的是嚴重影響了小編我的工作效率&#xff0c;沒有心情工作啊&#xff0c;要去泳池避避暑&#xff0c;沖個涼也行啊。這種天氣只…

WebKit 的結構、工作流程、技術細節和高級特性

WebKit 是一個開源的瀏覽器引擎&#xff0c;主要負責解析和渲染網頁&#xff0c;執行 JavaScript 代碼以及處理用戶交互。它最初由蘋果公司開發&#xff0c;用于 Safari 瀏覽器&#xff0c;但后來 Google 和其他公司也基于 WebKit 開發了自己的瀏覽器&#xff0c;如早期版本的 …

SQL Server時間轉換

第一種&#xff1a;format --轉化成年月日 select format( GETDATE(),yyyy-MM-dd) --轉化年月日&#xff0c;時分秒&#xff0c;這里的HH指24小時的&#xff0c;hh是12小時的 select format( GETDATE(),yyyy-MM-dd HH:mm:ss) --轉化成時分秒的&#xff0c;這里就不一樣的&…

力扣5----最長回文子串

給你一個字符串 s&#xff0c;找到 s 中最長的回文子串 示例 1&#xff1a; 輸入&#xff1a;s "babad" 輸出&#xff1a;"bab" 解釋&#xff1a;"aba" 同樣是符合題意的答案。示例 2&#xff1a; 輸入&#xff1a;s "cbbd" 輸出…

Feign-未完成

Feign Java中如何實現接口調用&#xff1f;即如何發起http請求 前三種方式比較麻煩&#xff0c;在發起請求前&#xff0c;需要將Java對象進行序列化轉為json格式的數據&#xff0c;才能發送&#xff0c;然后進行響應時&#xff0c;還需要把json數據進行反序列化成java對象。 …

G2.【C語言】EasyX繪制顏色窗口

1.窗口 窗口&#xff1a;寬度*高度&#xff08;單位都是像素&#xff09; #include <stdio.h> #include <easyx.h> int main() {initgraph(640, 480);getchar();return 0; } 640是寬&#xff0c;480是高 2.操作窗口的三個按鈕 #include <stdio.h> #incl…

go語言day10 接口interface 類型斷言 type關鍵字

接口&#xff1a; 空接口類型&#xff1a; 要實現一個接口&#xff0c;就要實現該接口中的所有方法。因為空接口中沒有方法&#xff0c;所以自然所有類型都實現了空接口。那么就可以使用空接口類型變量去接受所有類型對象。 類比java&#xff0c;有點像Object類型的概念&#x…