是时候忘记 findViewById 了

在 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

后续,我也会继续写这方面的内容,在这里就权当抛砖迎玉吧。: )

    原文作者:Hevin丶
    原文地址: https://www.jianshu.com/p/04244afc5ec5
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞