android学习笔记(六):DataBinding

前言:

其实一开始我是有点排斥?还是有点点害怕用陌生的东西来加入到我的代码中,这种习惯肯定是不好的啦,我的导师跟我说DataBinding可以更方便的去操作页面中的组件变化,我第一想法是,为什么原本的方法不好咩不能做到这样的操作嘛,已经挺方便了,但是在事实上用了这么一段时间后,DataBinding确确实实的提供了不少的帮助,就好像一开始觉得也就省下了那么一段或者一点点代码,但是不管是哪种页面的开发,都避免不了对组件的操作,积少成多的代码省下来确实蛮方便的,希望不要去过度排斥加入新的东西在自己的习惯中,慢慢去揣摩为什么要加入进去。

跳出自己的舒适圈才有进步,加油。

开始接触dataBinding

它是什么?在官方的文档中是这样描述的:数据绑定库

:您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。

简单以我的理解来说,它更方便的用binding.组件的形式替换了原本我们寻找组件的findViewById(id)方法。

简单的举个小栗子,在我的页面中有两个这样的TextView,回到首页的功能是点击一下就能回到我的首页中,我们来看看通过dataBinding和用原来的方法的区别。

private TextView back_main;
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //其他代码
        back_main = findViewById(R.id.back_main);
        back_main.setOnClickListener(view -> {
            ARouter.getInstance().build(BaseContent.RouteMain).navigation();
        });
    }

那如果是使用dataBinding呢?

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //其他代码
        mBinding.backMain.setOnClickListener(view -> {
            ARouter.getInstance().build(BaseContent.RouteMain).navigation();
        });
    }

相比之下dataBinding跟原来的方式少了两步代码,也就是定义成员变量和通过findById来找到这个组件,但是实际上习惯上用dataBinding不止是因为每次去操作控件都可以少两行代码,在我的使用习惯中,或者说dataBinding自己所提供了一个设置控件的点击事件操作的方法,它可以把页面上的点击事件都聚集在一块编写,这样在后续想要去找某块组件的点击事件的时候就不会乱七八糟的找不到,当然这块放在后面再说,现在只是简单的表达一下dataBinding简单的一个使用意义。

dataBinding的配置

dataBinding的配置特别的简单,只需要在build.gradle中配置:

android {
    ...
    buildFeatures {
        dataBinding true
    }
}

就开启了,那么如果我们想要在某个布局页面中使用dataBinding,只需要在布局文件的根组件中单击标签然后Alt+Enter万能键选择:

那么页面布局就会变成:

这样我们就完成了布局页面的dataBinding化。

dataBinding的使用

我们将一个布局页面dataBinding化之后呢,我们可以怎么去操作页面组件呢,我们先简单的在布局文件中写一个TextView。

...
<TextView
            android:id="@+id/back_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="回到首页"
            android:gravity="center"
            android:textSize="28sp"
            android:textStyle="bold"/>
...

我们想在代码中通过dataBinding来操作这个TextView组件,给它设置一个点击事件来跳转到我们的其他页面,那么具体的实现就是:

...
private 布局dataBinding mBinding;
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置布局
        mBinding = DataBindingUtil.setContentView(this,R.layout.布局);
        //设置点击事件
        mBinding.backMain.setOnClickListener(view -> {
            ARouter.getInstance().build(BaseContent.RouteMain).navigation();
        });
}
...

其中 布局dataBinding 是指当你的布局Binding化之后,就会生成的一个类似于你布局文件名的DataBind类,比如:我的布局文件名为:activity_databing 那么当我把这个布局文件binding化之后它会生成一个叫:ActivityDatabingBinding 的类。

(PS:这段的命名有点相似可能会看的有点晕请各位见谅)

再通过我们的mBinding来直接添加上点击事件,完成一次组件的点击事件配置。

dataBinding的其它部分

那么,dataBinding除了更方便的操作页面组件外,还有其它的优势吗?答案是肯定的,但是这也是我在编写过程的一个了解和发现,我们慢慢来挖掘和使用这些方法,并且讨论它们可以用在什么地方,首先第一个:数据的双向绑定

dataBinding的双向绑定

数据绑定(Data Binding)是一种在应用程序的用户界面(UI)和业务逻辑之间建立连接的技术。在Android开发中,Android Data Binding库允许你以声明性的方式将布局文件中的UI组件与应用程序中的数据源绑定在一起。这可以减少手动更新UI的代码,提高代码的可读性和维护性。

第一次看到这个描述的时候我第一时间带入了vue的数据双向绑定的概念,经过浅显了解发现目的确实大差不差,都是为了实现当页面比如说EditView的修改同时能够修改到所绑定的data数据,或者当传达过来的data数据发生改变的时候能够同时改变页面的元素,以达到双向绑定的一个目的。

我们来看看这个过程是怎么实现的:

定义模型
public class DataModel extends BaseObservable {
    private String content;
    @Bindable
    public String getContent() {
        return content;
    }
    public void setContent(String mContent) {
        this.content = mContent;
        //当数据发生改变的时候提醒改变
        notifyPropertyChanged(BR.content);
    }
}

首先我们定义一个继承BaseObservable的emmmmmm,也不算模型类吧,因为实际上我们所需要的数据模型是它的成员变量,这里的BaseObservable是一个DataBinding库提供的基类,用来实现观察者模式,使对象的属性变化能够通知到 UI 层。所以我们暂且叫它观察模型,这个类的成员变量就是我们需要实现双向绑定的数据,这里可以是自己定义的模型类,比如说后端统一传过来的数据模型,一个user对象啊或者别的,我们先只用一个String类型的content来表示。

然后就是在getter方法上面标记好@Bindable注解,这个注解的作用是告诉DataBinding库这个get方法里面的变量需要被观察,从而能够在数据发生变化时更新相关的 UI。

在布局文件中引入观察模型

接着,我们需要在已经转为dataBinding且需要双向数据绑定的布局文件中来引入上面的观察模型,我们需要在data标签中引入并命名好。

    <data>
        <import type="com.misuan.xxh.model.DataModel"/>
        <variable
            name="dataModel"
            type="DataModel" />
    </data>

其中variable中的name属性可以自己定义,怎么喜欢怎么来,然后我们需要在我们绑定这个数据组件中来引用这个模型。

<TextView
            android:id="@+id/back_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={dataModel.content}"
            android:gravity="center"
            android:textSize="28sp"
            android:textStyle="bold"/>

@={},这是dataBinding中实现双向绑定的语法,@={dataModel.content}表示我们这个text属性将会绑定我们刚刚传过来的模型的content变量值。

在代码中设置数据模型
    private DataModel dataModel;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        dataModel = new DataModel();
        dataModel.setContent("content");
        mBinding.setDataModel(dataModel);
        ...    
    }

这样就相当于我们已经给TextView的text值设置上了content这个字符串,让我们来看看是否如我们所想。

果然已经设置上去了,如果之后想要变动,比如说我们要验证它是否真的是实时变动,我们可以通过操作dataModel.set方法,比如我们在设置完dataModel之后再设置一个值,看看后面设置的值是否能够变化到页面上去。

dataModel = new DataModel();
        dataModel.setContent("content");
        mBinding.setDataModel(dataModel);
        dataModel.setContent("new content");

而最后的页面显示是:

算是成功验证了。

总结

没有总结!!来不及了啊啊啊啊踩点发布,后面有新点子再来更新嘿嘿嘿!求赞呀呀呀呀!!爱你们

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值