DataBinding的基本使用(二)

DataBinding的基本使用(二)

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

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

布局文件


<layout>

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

        
        <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)}" />
    LinearLayout>
layout>

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

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

布局文件


<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}" />
        

        <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类名)

文件目录如下
DataBinding的基本使用(二)_第1张图片

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

"www.zhang.com.databinding.activity.Item">
    ...



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

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


import www.zhang.com.databinding.Item;

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


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

Item binding =DataBindingUtil.setContentView(FiveActivity.this, R.layout.activity_five);

你可能感兴趣的:(android提升,binding,MVVM模式,运算符操作,自定义binding)