二、DataBinding 绑定UI (setVariable、setXXX)##
- 在xml中添加data数据绑定标签
<layout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”>
<variable
name=“user”
type=“tsou.cn.databinding.bean.User”/>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
tools:context=“tsou.cn.databinding.MainActivity”>
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:hint=“输入 Frist Name” />
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:hint=“输入 Last Name” />
<TextView
android:text=“@{user.fristName}”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content” />
<TextView
android:text=“@{user.lastName}”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content” />
- 将activity中的数据绑定到xml中
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
User user = new User();
user.setFristName(“huang”);
user.setLastName(“xiaoguo”);
// 第三步:使用 ActivityMainBinding
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
/**
- 将数据绑定到xml
*/
// 方法一:(常用)
//binding.setUser(user);
//方法二:
binding.setVariable(BR.user,user);
}
}
- 其他引入数据姿势
如果用户类型要多处用到,也可以直接将之后导入进来,
这样就不用每次都指明整个包名路径了,
而java.lang.*包中的类会被自动导入,所以可以直接使用
<variable
name=“user”
type=“User”/>
如果存在进口的类名相同的情况,可以使用别名指定别名
<import
alias=“TwoUser”
type=“tsou.cn.databinding.bean2.User” />
<variable
name=“user”
type=“User” />
<variable
name=“twoser”
type=“TwoUser” />
- xml中字符串拼接
- 创建Presenter类
public class Presenter{
//普通方法绑定
public void onTextChanged( CharSequence s,int start,int before,int color){
user.setFristName(s.toString());
binding.setUser(user);
}
//普通方法绑定
public void onClick(View view){
Toast.makeText(MainActivity.this.getApplicationContext(),“点击了”,Toast.LENGTH_LONG).show();
}
//监听器绑定,可以返回数据
public void onClickListenerBinding(User user){
Toast.makeText(MainActivity.this.getApplicationContext(),user.getLastName(),Toast.LENGTH_LONG).show();
}
}
- 在xml中传入presenter并进行绑定
第二步:在布局中跟节点添加layout
–>
<layout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”>
<variable
name=“user”
type=“tsou.cn.databinding.bean.User” />
<variable
name=“presenter”
type=“tsou.cn.databinding.MainActivity.Presenter” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
tools:context=“tsou.cn.databinding.MainActivity”>
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:hint=“输入 Frist Name”
android:onTextChanged=“@{presenter.onTextChanged}” />
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:hint=“输入 Last Name” />
<TextView
android:layout_gravity=“center”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:onClick=“@{presenter.onClick}”
android:text=“@{user.fristName}” />
<TextView
android:layout_gravity=“center”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:onClick=“@{()->presenter.onClickListenerBinding(user)}”
android:text=“@{user.lastName}” />
- acticity中绑定Presenter对象
binding.setPresenter(new Presenter());
- 效果如下:
支持的运算符:
-
数学运算符: + - / * %
-
字符串拼接: +
-
逻辑运算符: && ||
-
二进制: & | ^
-
一元运算符: +
-
位运算符: >> >>> <<
-
比较: == > < >= <=
-
instanceof
-
()
-
数据类型: character, String, numeric, null
-
类型转换(ClassCast)
-
方法回调(Method calls)
-
数据属性
-
数组:[]
-
三元操作符:?
例如:
android:text=“@{String.valueOf(index + 1)}”
android:visibility=“@{age < 13 ? View.GONE : View.VISIBLE}”
android:background=“@{true ? @color/colorAccent : @color/colorPrimary}”
android:transitionName=‘@{“image_” + id}’
一些在java中常用而DataBinding xml中不支持的:
-
this
-
super
-
new
-
泛型
空合并运算符
android:text=“@{user.displayName ?? user.lastName}”
等价于
android:text=“@{user.displayName != null ? user.displayName : user.lastName}”
- view的显示和隐藏
在xml data节点下引入view
view的显示和隐藏
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:text=“是否显示”
android:textColor=“@color/colorAccent”
android:textSize=“24sp”
android:visibility=“@{user.isShow ? View.VISIBLE:View.GONE }” />
- 创建include布局
在布局中跟节点添加layout
–>
<layout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”>
<variable
name=“user”
type=“tsou.cn.databinding.bean.User” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:text=“@{user.fristName}” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“center”
android:text=“@{user.lastName}” />
- 使用include布局并传递数据
<include
layout=“@layout/include_layout”
bind:user=“@{user}” />
- 效果如下
- ViewStub布局
在布局中跟节点添加layout
–>
<variable
name=“user”
type=“tsou.cn.databinding.bean.User” />
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>
<ImageView
android:layout_width=“100dp”
android:layout_height=“100dp”
android:layout_gravity=“center”
android:src=“@mipmap/ic_launcher_round” />
<TextView
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@{user.imageId}” />
- 调用ViewStub
<ViewStub
android:id=“@+id/view_stub”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout=“@layout/viewstub”
bind:user=“@{user}” />
- 加载viewStub
//使用viewStub
binding.viewStub.getViewStub().inflate();
- 将javaBean继承BaseObservable
package tsou.cn.databinding.bean;
import android.databinding.BaseObservable;
import android.databinding.Bindable;
import tsou.cn.databinding.BR;
/**
- Created by Administrator on 2018/5/25 0025.
*/
//BaseObservable数据自动更新的使用
public class User extends BaseObservable {
private String fristName;
private String lastName;
private String imageUrl;
private boolean isShow;
@Bindable
public boolean getIsShow() {
return isShow;
}
public void setIsShow(boolean show) {
isShow = show;
notifyPropertyChanged(BR.isShow);
}
@Bindable
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
notifyPropertyChanged(BR.imageUrl);
}
@Bindable
public String getFristName() {
return fristName;
}
public void setFristName(String fristName) {
this.fristName = fristName;
notifyPropertyChanged(BR.fristName);
}
@Bindable
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
注意:
1、首先当前类继承BaseObservable
2、对于get方法添加@Bindable注解
3、引入BR.lastName等报错时,需要对项目先进行一下修复
- 布局中进行监听
<EditText
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:hint=“输入 Frist Name”
android:onTextChanged=“@{presenter::onTextChanged}” />
- 调用方法
public class Presenter {
//普通方法绑定
public void onTextChanged(CharSequence s, int start, int before, int color) {
user.setFristName(s.toString());
//此时不需要再次手动进行更新数据对象了
// binding.setUser(user);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
结尾
最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
接下来是资料清单:(敲黑板!!!)
领取通道在这里给你们摆上了~
点击我的GitHub免费获取
1.数据结构和算法
2.设计模式
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
7)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-zhri1mTZ-1711379911587)]
结尾
最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
[外链图片转存中…(img-88T7nRYX-1711379911588)]
接下来是资料清单:(敲黑板!!!)
领取通道在这里给你们摆上了~
点击我的GitHub免费获取
1.数据结构和算法
[外链图片转存中…(img-eVcgAtIK-1711379911588)]
2.设计模式
[外链图片转存中…(img-iZnJkY1b-1711379911589)]
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
[外链图片转存中…(img-fIviiAUK-1711379911589)]
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
[外链图片转存中…(img-sjjoVhsS-1711379911590)]
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-B4eT6lr2-1711379911590)]