在 Android 开发中 findViewById 相信是大家写得最多的方法之一。一个稍微复杂点的界面就需要写一大段的 findViewById,相当的浪费时间。之前已经有了很多的工具来帮助我们,但是现在我们终于迎来了官方支持的方法了。
首先,在你应用的 build.gradle 中添加:
android {
...
dataBinding.enabled = ture
}
之后,在你的界面文件中,用 <layout></layout> 把已有的布局包裹起来。就像下面这样:
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<TextView
android:id="@+id/tv_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</android.support.v4.widget.DrawerLayout>
</layout>
然后就可以在 Activity 中用下面的方式来绑定数据了:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.tvHello.setText("Hello World");
其中的 ActivityMainBinding,是根据具体的 layout 文件名来决定的。之后就能够使用 binding 和对应组件的 id 来进行一系列的操作啦。在这里需要注意资源文件和代码中名称的对应关系,可以看到 TextView 的 id 为 tv_hello,代码中就相应变为 tvHello;布局文件的名称为 activity_main,对应 Binding 的名称就为 ActivityMainBinding。
当使用 RecyclerView,ViewPager 等不是调用 setContentView 的控件时,可以用下面的方法:
ActivityMainBinding binding = DataBindingUtil.inflate(
getLayoutInflater(), container, attchToContainer);
当需要将渲染的视图添加到其他 ViewGroup 中时,可以用 getRoot() 来得到根视图:
linearLayout.addView(binding.getRoot());
是不是感觉很方便?但更好的是这并没有用到反射或任何相对复杂的技术,在不影响性能的情况下,可以告别那麻烦又冗长的 findViewById 了。
当然 Android Data Binding 还有很多进阶用法,大家可以参考这里:
https://developer.android.com/topic/libraries/data-binding/index.html
后续,我也会继续写这方面的内容,在这里就权当抛砖迎玉吧。: )