要启用 Android X 下的 viewBinding
和 viewModel
,首先要在需要启用的模块的 build.gradle
文件中添加 viewBinding
元素。
android { ... viewBinding { enabled = true } } 复制代码
该功能要求 Android Studio 3.6 Canary 11 及更高版本 才能支持。
然后添加 viewModel
的依赖项。
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0" 复制代码
写文章时最新稳定版本为 2.2.0
,要获取当前最新版本,可前往 Lifecycle 处。
使用 viewBinding
的 layout 文件格式如下:
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/> </LinearLayout> </layout> 复制代码
根标签需要是 <layout>
,原先的布局根标签需要改为 <layout>
的子标签。
<data>
标签描述可以在 view 中访问的属性,通过 name
里的名称即可访问,<variable>
标签可以有复数个。
对于属性的访问使用 @{}
语法。
会自动为 layout 文件生成对应的 Binding 类,并通过驼峰法转换名称。如 layout 名称为 result_profile.xml
,对应的 Binding 类名称为 ResultProfileBinding
。
可以通过 binding.root
来直接访问根视图。如示例中的会返回 LinearLayout
根视图。
Activity 和 Fragment 绑定方法不同,需要根据类型调用相应的绑定方法。
Activity:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = ViewmodelProfileBinding.inflate(layoutInflater) setContentView(binding.root) // 方法2: val binding: ViewmodelProfileBinding = DataBindingUtil.setContentView(this, R.layout.viewmodel_profile) } 复制代码
Fragment:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val binding = FragmentBillBinding.inflate(inflater, container, false) // 方法2:val binding: FragmentBillBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_bill, container, false) return binding.root } 复制代码
可以通过
binding.xxx
来访问布局文件里对应的 view 。
viewModel
在 2.2.0 版本中的创建方法和之前的有所不同,新的创建方法如下:
val viewModel: BillViewModel = ViewModelProvider(this)[BillViewModel::class.java] 复制代码
在 2.2.0 版本中,旧的 ViewModelProviders.of()
已经弃用,需要使用新的 ViewModelProvider
构造方法。详见 版本 2.2.0 。
创建好 viewModel
后需要在 Activity 或 Fragment 中将其与 view 绑定,绑定方法如下:
binding.viewModel = viewModel binding.lifecycleOwner = this 复制代码
其中 binding.viewModel
需要在 layout
文件中 <data>
标签内预先声明,赋值时使用的 viewModel
属性如 android:text="@{viewModel.name}"
中的 name
需要是 LiveData
类型。
必须要声明 lifecycleOwner
。
绑定之后,viewModel.name
的变化会同步刷新 UI ,不需要再单独为其设置 observe
。