义乌网站建设工作室,用帝国cms做企业网站,wordpress媒体库缩略图不现实,做公司网站主要需要什么科目不经一番寒彻骨#xff0c;怎得梅花扑鼻香 一#xff0c;定义
DataBinding, 又名数据绑定#xff0c;是Android开发中非常重要的基础技术#xff0c;它可以将UI组件和数据模型连接起来#xff0c;使得在数据模型发生变化时#xff0c;UI组件自动更新。是 MVVM 模式在 An…不经一番寒彻骨怎得梅花扑鼻香 一定义
DataBinding, 又名数据绑定是Android开发中非常重要的基础技术它可以将UI组件和数据模型连接起来使得在数据模型发生变化时UI组件自动更新。是 MVVM 模式在 Android 上的一种实现用于降低布局和逻辑的耦合性使代码逻辑更加清晰。MVVM 相对于 MVP其实就是将 Presenter 层替换成了 ViewModel 层。DataBinding 能够省去我们一直以来的 findViewById() 步骤大量减少 Activity 内的代码数据能够单向或双向绑定到 layout 文件中有助于防止内存泄漏而且能自动进行空检测以避免空指针异常 二基本使用
1在app的build.gradle中 开启databinding
defaultConfig {applicationId com.yuanzhen.lifecycledemominSdk 24targetSdk 33versionCode 1versionName 1.0testInstrumentationRunner androidx.test.runner.AndroidJUnitRunner//使用databindingdataBinding{enabled true}
}
2在布局文件XML中选中根布局ALT回车 选择Convert to data binding layout 会自动转换为 DataBinding 需要的布局规则
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdata/dataRelativeLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/txt_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/txt_ageandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentandroid:layout_belowid/txt_name//RelativeLayout
/layout
3 创建数据bean
public class YuanZhen {public YuanZhen(String name, int age) {this.name name;this.age age;}private String name;private int age;public void setName(String name) {this.name name;}public void setAge(int age) {this.age age;}public String getName() {return name;}public int getAge() {return age;}
}
4在XML中设置创建的数据bean
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdataimport typecom.yuanzhen.lifecycledemo.databing.YuanZhen/variablenameyuanzhentypeYuanZhen//dataRelativeLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/txt_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{yuanzhen.name}app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/txt_ageandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{String.valueOf(yuanzhen.age)}app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentandroid:layout_belowid/txt_name//RelativeLayout
/layout
注意这里的int需要转换为String
5在Activity中用DatabindingUtil 替换原来的setContentView创建数据源绑定databinding
public class MainActivity extends AppCompatActivity {private ActivityMainBinding dataBinding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);dataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);YuanZhen yuanZhen new YuanZhen(袁震,18);dataBinding.setYuanzhen(yuanZhen);}}
运行 三特殊用法
1,在上面我们使用的ActivityMainBinding 是自动生成的这里我们可以自定义它的名称MyDataBing
data classMyDataBingimport typecom.yuanzhen.lifecycledemo.databing.YuanZhen/variablenameyuanzhentypeYuanZhen/
/data
public class MainActivity extends AppCompatActivity {private MyDataBing dataBinding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);dataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);YuanZhen yuanZhen new YuanZhen(袁震,18);dataBinding.setYuanzhen(yuanZhen);}
}
2,我们可以通过databinding获取在XML里面赋值的组件
public class MainActivity extends AppCompatActivity {private MyDataBing dataBinding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);dataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);YuanZhen yuanZhen new YuanZhen(袁震,18);dataBinding.setYuanzhen(yuanZhen);dataBinding.txtName.setText(袁震1111);dataBinding.txtAge.setText(28);}
}
注意这里赋值了并不会刷新
四单向数据绑定
实现数据变化自动驱动 UI 刷新的方式有三种BaseObservable、ObservableField、ObservableCollection
BaseObservable是一个纯净的 ViewModel 类被更新后并不会让 UI 自动更新。而数据绑定后我们自然会希望数据变更后 UI 会即时刷新Observable 就是为此而生的概念
BaseObservable 提供了 notifyChange() 和 notifyPropertyChanged() 两个方法前者会刷新所有的值域后者则只更新对应 BR 的 flag该 BR 的生成通过注释 Bindable 生成可以通过 BR notify 特定属性关联的视图
下面来看下使用案例
1将数据Bean继承BaseObservable 并实现刷新方法
public class YuanZhen extends BaseObservable {public YuanZhen(String name, int age) {this.name name;this.age age;}private String name;private int age;public void setName(String name) {this.name name;notifyPropertyChanged(BR.name);}public void setAge(int age) {this.age age;notifyPropertyChanged(BR.age);}Bindablepublic String getName() {return name;}Bindablepublic int getAge() {return age;}
}
2在Activity中每隔1s改变一下name和age
public class MainActivity extends AppCompatActivity {private MyDataBing dataBinding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);dataBinding DataBindingUtil.setContentView(this, R.layout.activity_main);YuanZhen yuanZhen new YuanZhen(袁震,18);dataBinding.setYuanzhen(yuanZhen);new Thread(new Runnable() {Overridepublic void run() {for (int i 0; i 10; i) {try {Thread.sleep(1000);yuanZhen.setName(yuanZhen.getName()i);// view.setText(text);yuanZhen.setAge(18i);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}
}
运行结果 五双向数据绑定
双向绑定的意思即为当数据改变时同时使视图刷新而视图改变时也可以同时改变数据
我们在xml里面增加一个EditText这个EditText绑定了yuanzhen.name
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdata classMyDataBingimport typecom.yuanzhen.lifecycledemo.databing.YuanZhen/variablenameyuanzhentypeYuanZhen//dataRelativeLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:idid/txt_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{yuanzhen.name}android:textSize40spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/txt_ageandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textSize40spandroid:text{String.valueOf(yuanzhen.age)}app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentandroid:layout_belowid/txt_name/EditTextandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_belowid/txt_ageandroid:textSize40spandroid:text{yuanzhen.name}//RelativeLayout
/layout
其余代码还是保持不变让我们来看运行结果 六运算符
DataBinding 支持在布局文件中使用以下运算符、表达式和关键字* 算术 - / \* %
* 字符串合并
* 逻辑 ||
* 二元 | ^
* 一元 - ! ~
* 移位
* 比较
* Instanceof
* Grouping ()
* character, String, numeric, null
* Cast
* 方法调用
* Field 访问
* Array 访问 \[\]
* 三元 ?:目前不支持以下操作* this
* super
* new
* 显示泛型调用