DataBinding的基本使用(二)

DataBinding的基本使用(二)

DataBinding基本使用包括以下内容:
- 单纯的摆脱findviewbyid
- 绑定基本数据类型及String
- 绑定Model数据
- 绑定事件
- 通过静态方法转换数据类型
- 通过运算符操作数据
- 自定义Binding的类名
- 绑定相同Model的操作
- model变量改变自动更新数据
- 绑定List/Map等集合数据
- Observable自动更新
- Databinding与include标签的结合
- DataBinding与RecyclerView的结合

3.5通过静态方法转化数据类型

布局文件

<?xml version="1.0" encoding="utf-8"?><!--布局以layout作为根布局-->
<layout>

    <data>
     <variable
            name="user"
            type="www.zhang.com.databinding.User" />

        <!--调用静态方法,需要先导入需要的包    当然java中的lang包可以不用导包-->
        <import type="www.zhang.com.databinding.Utils" />

    </data>
    <!--我们需要展示的布局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_btn5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{Utils.getName(user)}" /><!--就和java中写代码一样,只要符合数据类型就好-->
    </LinearLayout>
</layout>

静态方法的类(当然也可以使用java自带API)

public class Utils {
    public static String getName(Object o) {
        return o.getClass().getName();
    }
}
3.6通过运算符操作数据

布局文件

<?xml version="1.0" encoding="utf-8"?><!--布局以layout作为根布局-->
<layout>

    <data>

        <variable
            name="user2"
            type="www.zhang.com.databinding.model.User" />

    </data>
    <!--我们需要展示的布局-->
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="www.zhang.com.databinding.MainActivity">

        <Button
            android:id="@+id/main_btn5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="@{user2.state ? @dimen/largepadding : (int)@dimen/smallpadding}"
            android:text="@{user2.content ?? @string/app_name}" />
        <!-- android:text="@{user2.content ?? @string/app_name}"
         等价于
         android:text="@{user2.content!=null? user2.content : @string/app_name}"-->

        <Button
            android:id="@+id/main_btn6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{`Hello World`+ @string/app_name}" /><!-- ``字符包裹的表示字符串,可用作拼接字符串 -->

    </LinearLayout>
</layout>
public class User {
    private String content;
    private boolean state;

    public User(String content, boolean state) {
        this.content = content;
        this.state = state;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }

}

MainActivity中

package www.zhang.com.databinding;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import www.zhang.com.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //通过DataBInding加载布局都会对应的生成一个对象,如ActivityMainBinding,对象名在布局文件名称后加上了一个后缀Binding
        binding = DataBindingUtil.setContentView(MainActivity.this, R.layout.activity_main);

        //运算符操作
        www.zhang.com.databinding.model.User user2 = new www.zhang.com.databinding.model.User("通过运算符操作数据", true);
//        user2 = new www.zhang.com.databinding.model.User(null, false);    改变数据作为测试DataBinding是否有效
        binding.setUser2(user2);

    }
}

DataBinding支持的表达式有:

数学表达式: + - / * %

字符串拼接 +

逻辑表达式 && ||

位操作符 & | ^

一元操作符 + - ! ~

位移操作符 >> >>> <<

比较操作符 == > < >= <=

instanceof

分组操作符 ()

字面量 - character, String, numeric, null

强转、方法调用

字段访问

数组访问 []

三元操作符 ?:

聚合判断(Null Coalescing Operator)语法 ‘??’

3.7自定义Binding的类名

data标签有个class属性,它可以用来对Binding对象重新命名(一般是以布局文件名加上Binding后缀作为该Binding类名)

文件目录如下
image

自定义类名有3中方式
1. 通过指定全类名的方式

<data class="www.zhang.com.databinding.activity.Item">
    ...
</data>


import www.zhang.com.databinding.activity.Item;

Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
  1. 直接生成在项目的包目录下
<data class=".Item">
    ...
</data>

import www.zhang.com.databinding.Item;

Item binding = DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
  1. 如果FiveActivity直接在包下与方式二相同,如果FiveActivity在包的子目录下,则Binding生成的目录如下
<data class="Item">
    ...
</data>

import www.zhang.com.databinding.databinding.Item;

Item binding =DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);
发布了336 篇原创文章 · 获赞 328 · 访问量 98万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览