初窥DataBinding数据绑定框架,效率解决界面逻辑

时间:15年谷歌I/O大会介绍
作用:

  • 数据绑定框架给我们带了很大的方便
  • 省去每个Activity里很多的findViewById,省去麻烦并解耦
  • ButterKnife这种快速的注解框架,但是和DataBinding相比还是不好用(官方文档介绍DataBinding还能提高解析XML的速度)

环境搭建(AS1.5之后)
- Android 的 Gradle 插件版本不低于 1.5.0-alpha1: classpath
- ‘com.android.tools.build:gradle:1.5.0’
- 然后修改对应模块(Module)的 build.grade:

android {
    compileSdkVersion 25
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "databinding.databinding"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {//注意是这里,我黏贴的比较多,好多人是因为不知道DataBinding具体写在哪
        enabled = true
    }
}

注意

  1. AS版本要大于1.3(不过目前应该没有用1.3以下了的吧)
    如果是之前版本自行上网查,很多教程
  2. Android Studio目前对binding对象没有自定代码提示,只会编译的时候检查

简单用法:
1,一个普通javabean

package databinding.databinding;

/**
 * Created by fengan on 2016/12/23.
 * databinding.databinding
 */

public class User {
    private String name;
    private String age;//注意是String类型,int不可以

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

2,布局xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <!--type中声明的就是我们的用户实体类User,一定要写全,带着包名,我们给这个实体类命名为user [这是第一种写法,建议用下面这种导包的形式]-->
    <!--<data>-->
        <!--<variable-->
            <!--name="user"-->
            <!--type="databinding.databinding.User" />-->
    <!--</data>-->
    <data>
        <import type="databinding.databinding.User"/>
        <variable name="user" type="User" />
        <variable
            name="myClick"
            type="android.view.View.OnClickListener"></variable>
    </data>
    <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:text="@{user.name}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.age}" />
        <Button
            android:onClick="@{myClick}"//绑定点击事件
            android:text="点击"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</layout>

3,Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //用 DatabindingUtil.setContentView() 来替换掉 setContentView(),
        // 然后创建一个 user 对象,通过 binding.setUser(user) 与 variable 进行绑定。
        ActivityMainBinding binding= DataBindingUtil.setContentView(this, R.layout.activity_main);
        User itfengan = new User("itfengan", "24");
        binding.setUser(itfengan);
        binding.setMyClick(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

如果包名不同类名相同情况(可以取别的昵称name)

···
<data> 
  <import type="xxx.User" alias="MyUser"> 
  <import type="xxx.xx.User"> 

   <variable 
            name="user" 
            type="User" /> 
    <variable 
            name="myUser" 
            type="MyUser"/> 
</data> 
<TextView xxx:@{myUser.getName()}> 
<TextView xxx:@{user.getName()}>
···

针对其他变量类型
比如:List.Map这种集合变量,要赋值的话还涉及到为map定义key的变量,如下

<layout xmlns:android="http://schemas.android.com/apk/res/android"> 
        <data> 
            <import type="android.graphics.Bitmap" /> 
            <import type="java.util.ArrayList" /> 
            <import type="java.util.HashMap" />  
          <!-- 集合的定义 -->
            <variable 
                name="list" 
                type="ArrayList<String>" /> 
            <variable 
                name="map" 
                type="HashMap<String, String>" /> 
            <variable 
                name="array" 
                type="String[]" /> 
          <!-- 为集合定义对应的索引 -->
            <variable 
                name="listKey" 
                type="int" /> 
            <variable 
                name="mapKey" 
                type="String" /> 
            <variable 
                name="arrayKey" 
                type="int" /> 

            <!-- 字符串,布尔值和int的用法-->
            <variable 
                name="str" 
                type="String"/> 
            <variable 
                name="error" 
                type="boolean"/> 
            <variable 
                name="num" 
                type="int" /> 

        </data> 

        <LinearLayout 
            android:orientation="vertical" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"> 

            <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@{list[listKey]}"/> 

            <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@{map[`name`]}"/> 
            <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@{array[0]}"/> 

            <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@{str}"/> 
            <TextView 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:text="@{String.valueOf(num)}"/> 
        </LinearLayout> 
    </layout>

当然我们也可以返璞归真,为带id的控件赋值
Xml

<TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
           />

Activity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.name.setText("非著名程序员");
    }

如果报一下错,就是user的age属性是int的原因,改为String就好了

12-23 10:45:24.211 14607-14607/databinding.databinding E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: databinding.databinding, PID: 14607
                                                                         android.content.res.Resources$NotFoundException: String resource ID #0xd
                                                                             at android.content.res.Resources.getText(Resources.java:299)
                                                                             at android.widget.TextView.setText(TextView.java:4132)
                                                                             at databinding.databinding.databinding.ActivityMainBinding.executeBindings(ActivityMainBinding.java:131)

其他错误

程序包com.***.databinding不存在

就是你的xml哪里格式有错误,因为是DataBinding是不提示的,所以写的时候要注意
使用过程中其他错误参考:
http://m.blog.csdn.net/article/details?id=50573487
以上内容主要参考
http://www.jianshu.com/p/2d3227d9707d

阅读更多
文章标签: DataBindin 框架
个人分类: Android
想对作者说点什么? 我来说一句

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

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭