android:DataBinding使用小结(一(1),再不了解你就out啦


二、DataBinding 绑定UI (setVariable、setXXX)##


  • 在xml中添加data数据绑定标签
<?xml version="1.0" encoding="utf-8"?>

<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并进行绑定
<?xml version="1.0" encoding="utf-8"?>

第二步:在布局中跟节点添加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());

  • 效果如下:

这里写图片描述

四、xml中对表达式的支持


支持的运算符:

  • 数学运算符: + - / * %

  • 字符串拼接: +

  • 逻辑运算符: && ||

  • 二进制: & | ^

  • 一元运算符: +

  • 位运算符: >> >>> <<

  • 比较: == > < >= <=

  • 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的使用##


  • 创建include布局
<?xml version="1.0" encoding="utf-8"?>

在布局中跟节点添加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使用


  • ViewStub布局
<?xml version="1.0" encoding="utf-8"?>

在布局中跟节点添加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();

七、BaseObservable数据更新监听使用


  • 将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移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

结尾

最后,针对上面谈的内容,给大家推荐一个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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值