Android Studio3.5里使用DataBinding,飞起来!

743 阅读3分钟

本来不打算写这篇的,但是有点激动,就记录下吧。在studio3.5之前的版本里。使用DataBinding的时候,经常会出现一些莫名其妙的bug。在xml没有代码提示也就忍了。但是有时候连在代码里代码都不提示。忍不了。在看了3.5的优化中,有一点说,只要在xml里写上绑定数据,都不用build,IDE会自动取生成,然后代码提示的问题也不见了,果断从3.2.0升级到了3.5。
唯一要注意的问题是studio3.5格式化布局,布局错乱解决方案



这里我说下2点经典优点。文章末尾会放出链接。即使不学习不使用MVVM框架。我也觉得对android开发之路有很大的帮助。

一、或许你以后会远离butterKnife 之初识DataBinding

不需要引入任何依赖,只要在你项目build.gradle的android标签上,加上:

dataBinding {
        enabled = true
    }

然后布局最外层用layout包裹。像这样。

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

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

</layout>

然后在Activity里只要进行数据绑定下。就可以使用了

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sencond);
        ActivitySencondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_sencond);
        binding.txt.setText("Hello Girl!!");
    }
}
  • ActivitySencondBinding 是DataBinding帮你生成的。是按照你的xml文件名+Binding生成。我这里xml:R.layout.activity_sencond
  • DataBindingUtil:也是系统类(想想,在列表里ViewHolder里使用太爽)
  • 通过binding.txt就获得到控件了。从此拒绝findViewById。或许也会让你远离butterKnife
  • 虽然要写一下绑定的代码。但是你可以把它封装在Base里。统一用ViewDataBinding。这是他们的父类。但是在使用的时候记得强转成你当前的Binding

二、进行数据绑定

对于上面的的代码。我们可以继续优化。(这里看起来虽然有点脱裤子放屁,但是用到MVVM里确是可以实现数据和xml的双向绑定) 我们把Activity的布局改成这样

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="textStr"
            type="String" />
        
    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{textStr}"
            />

    </RelativeLayout>

</layout>
  • 加上 data 标签,variable 标签代表要绑定的一个值。name:相当于引用。type:是导入的包。在studio3.5后,有了代码提示
  • 设置数据用@{textStr}。textStr是上面的引用。

那么此时的Activity里的代码是:

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sencond);
        ActivitySencondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_sencond);
        binding.setTextStr("Hello Girl!!");
    }
}

这里就算是数据绑定了。如果是要设置点击事件直接在加个绑定值data标签上加上:

       
            
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        ...//省略代码便于理解
        <variable
            name="onClickListener"
            type="android.view.View.OnClickListener" />
        
    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{textStr}"
            android:onClick="@{onClickListener}"
            />

    </RelativeLayout>

</layout>

Activity里当然是要把这个onClickListener设置进去了,Activity实现View.OnClickListener接口如下:

public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sencond);
        ActivitySencondBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_sencond);
        binding.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "就是这样", Toast.LENGTH_SHORT).show();
    }
}

结束语

网上已经有很多讲的很详细了这里放2个链接:

入门到进阶

DataBinding系列

希望对想要了解这块的兄弟有所帮助。!个人觉得。写一行绑定代码,可以帮你的Activity的页面节约多少代码啊!即使你用butterKnife,那也是很多很多。