环境设置
要启用 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 处。
使用步骤
修改 layout 文件
使用 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 绑定
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 。