Android Data Binding实战-入门篇(补充)

来源:互联网 发布:最好的网络云盘 编辑:程序博客网 时间:2024/06/05 17:57

1、有关在@{}中的表达式

(1)使用单引号把属性包起来,就可以很简单地在表达式中使用双引号:

android:text='@{"...."}'

(2)也可以用双引号将属性包起来。这样的话,字符串常量就可以用 ” 或者反引号 ( ` ) 来调用(注意是反引号而不是单引号):

android:text="@{`...`}"

(3)有些特殊的符号无法常规表示先,需要用到转义符(注意转义符后面的“;”不能去掉)
这里写图片描述

2、ObservableFields

创建 Observable 类还是需要花费一点时间的,如果想要省时,或者数据类的字段很少的话,可以使用 ObservableField 以及它的派生 ObservableBoolean、ObservableByte 、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble、ObservableParcelable 。

当我在使用ObservableInt的时候,出现了一下问题,作为备忘,至于其他类型没有实测,如果出现类似问题可供参考。

(1)ObservableInt num=new ObservableInt();一定要使用new对其进行初始化,一定要初始化,否则会在引用的使用空指针异常,其根本原因是ObservableInt是类,而非基础类型,目前还不支持像基础类型那样默认初始化。

(2)ObservableFields字段一定需要get方法(可以没有set方法,但是如果需要在其他地方设置就需要该变其的可见性为public,但是就算改为public还是需要get方法),且返回值类型需为字段对应的类型。

public ObservableInt getNum() {return num;}

如果没有get方法或者该方法的返回值类型不正确,例如自己打包成int类型:

public int getNum() {return num.get();}

都是不会达到预期效果的。这是因为系统在检测到variable对应的ObservableFields类型的成员变量时,会调用相应的get方法获得该变量的引用,而不是其值。

(3)为TextView等的android:text属性设置内容时,其内容需为String类型,否则会出现异常,特地提出这一点是因为我在尝试ObservableInt时,排除了前两点提到的错误之后,还是不能正常运行,搞了半天才排查出这点提及的错误。

3、ViewStubs

有关ViewStubs的具体内容,请自行百度。这里只补充在Data Binding中使用ViewStub时的几个点。

ViewStub 相比普通 View 有一些不同。ViewStub 一开始是不可见的,当它们被设置为可见,或者调用 inflate 方法时,ViewStub 会被替换成另外一个布局。
因为 ViewStub 实际上不存在于 View 结构中,binding 类中的类也得移除掉,以便系统回收。因为 binding 类中的 View 都是 final 的,所以Android 提供了一个叫 ViewStubProxy 的类来代替 ViewStub(这里实际上就是代理模式) 。开发者可以使用它来操作 ViewStub,获取 ViewStub inflate 时得到的视图。

接下来就用具体的代码来讲解:
首先在一个布局中使用了ViewStub:

<layout xmlns:android="http://schemas.android.com/apk/res/android">    <LinearLayout ...>        <ViewStub            <!--需要设置一个id方便直接引用-->            android:id="@+id/view_stub"            android:layout="@layout/include"            ... />    </LinearLayout></layout>

在include布局中有一个name为User的variable,其类型为自定义的User。

然后需要在在 Java 代码中获取 binding 实例,为 ViewStubProxy 注册 ViewStub.OnInflateListener 事件:

xxxBinding.viewStub.setOnInflateListener(new ViewStub.OnInflateListener() {    @Override    public void onInflate(ViewStub stub, View inflated) {        IncludeBinding viewStubBinding = DataBindingUtil.bind(inflated);        User user = new User("Connor", "Lin", 28);//自定义的User实例对象        viewStubBinding.setUser(user);    }});

之后还需要执行xxxBinding.viewStub.getViewStub().inflate();来使引用的include布局显示出来,因此可以在需要显示include布局的时候再调用该方法。

其中xxxBinding.viewStub实际上得到的是ViewStubProxy类型,再使用getViewStub()方法之后才是得到真正的ViewStub。
inflate()成功之后会触发ViewStub.OnInflateListener(),因此可以在其中初始化include中的一些内容。

4、格式化字符串

在设置android:text时,是可以用Data Binding来格式化其内容的,比如在values文件下的strings.xml的资源文件中有一个<string name="format_test">Hello %s</string>,则在使用时如下:

android:text="@{@string/format_test(some string)}"

其结果就为Hello +some string

0 0
原创粉丝点击