视图绑定
视图绑定的作用
- 视图绑定: 为某个模块启用视图绑定功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。每个绑定类均包含对根视图以及具有 ID 的所有视图的引用。系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。
视图绑定的使用方式
- 在应用的build.gradle的android的大括号中新增
buildFeatures {
viewBinding true
}
- 在Activity中进行视图绑定(假设视图对应的xml文件名为:result_profile.xml)
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
- 在Fragment中使用视图绑定(假设视图对应的xml文件名为:result_profile.xml)
private var _binding: ResultProfileBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
ViewModel
ViewModel作用
- ViewModel: ViewModel 是视图中显示的应用数据的模型。模型是负责处理应用数据的组件,能够让应用遵循架构原则,通过模型驱动界面。ViewModel 存储应用相关的数据,这些数据不会在 Android 框架销毁并重新创建 activity 或 fragment 时销毁。在配置更改期间会自动保留 ViewModel 对象(不会像销毁 activity 或 fragment 实例一样将其销毁),以便它们存储的数据立即可供下一个 activity 或 fragment 实例使用。
ViewModel使用
- 在应用的build.gradle中引入依赖
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
- 创建对应类
class GameViewModel : ViewModel() {
}
- 将ViewModel附加到Activity/Fragment
private val viewModel: GameViewModel by viewModels()
LiveData
LiveData作用
- LiveData 可存储数据;LiveData 是一种可存储任何类型的数据的封装容器。
- LiveData 是可观察的,这意味着当 LiveData 对象存储的数据发生更改时,观察器会收到通知。
- LiveData 具有生命周期感知能力。当您将观察器附加到 LiveData 后,观察器就会与 LifecycleOwner(通常是 activity 或 fragment)相关联。LiveData 仅更新处于活跃生命周期状态(例如 STARTED 或 RESUMED)的观察器。您可以在此处详细了解 LiveData 和观察。
LiveData使用
- 在应用的build.gradle中引入依赖
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
- 一般是在ViewModel中定义被LiveData封装的对象
private val _currentScrambledWord = MutableLiveData<String>()
val currentScrambledWord: LiveData<String>
get() = _currentScrambledWord
- 在Activity/Fragment中引入对应的ViewModel对象
viewModel.currentScrambledWord.observe(viewLifecycleOwner) { newWord ->
}
数据绑定
数据绑定作用
- 数据绑定使用声明性格式将布局中的界面组件绑定到应用中的数据源,简而言之,数据绑定就是将数据(从代码)绑定到视图 + 视图绑定(将视图绑定到代码)
数据绑定使用
- 在 build.gradle(Module) 文件中的 buildFeatures 部分下,启用 dataBinding 属性
buildFeatures {
dataBinding = true
}
- 若要在任何 Kotlin 项目中使用数据绑定,应当应用 kotlin-kapt 插件
plugins {
id 'kotlin-kapt'
}
- 将布局文件转换为数据绑定布局,数据绑定布局文件略有不同,以根标记 开头,后跟可选 元素和 view 根元素。此 view 元素就是非绑定布局文件中的根。
<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">
<data>
</data>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
...
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</layout>
- 在 Fragment 中的 onCreateView() 方法开头,将 binding 变量的实例化。
private lateinit var binding: GameFragmentBinding
binding = DataBindingUtil.inflate(inflater, R.layout.game_fragment, container, false)
- 在Activity中的onCreate()方法,将将 binding 变量实例化
private lateinit var actBinding: ActivityMainBinding
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
- 若想要在布局文件中添加属性,以访问viewModel中的应用数据,需要先在布局文件中初始化布局变量,在 game_fragment.xml 中的 标记内添加名为 的子标记内,声明一个名为 gameViewModel、类型为 GameViewModel 的属性。您将使用此属性将 ViewModel 中的数据绑定到布局
<data>
<variable
name="gameViewModel"
type="com.example.android.unscramble.ui.game.GameViewModel" />
</data>
- 在 GameFragment 中的 onViewCreated() 方法开头,初始化布局变量 gameViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.gameViewModel = viewModel
}
- LiveData 是生命周期感知型可观察对象,因此您必须将生命周期所有者传递给布局。在 GameFragment 中的 onViewCreated() 方法内,在绑定变量的初始化下方添加以下代码。
binding.lifecycleOwner = viewLifecycleOwner
- 后续的布局中的参数绑定方式参考:使用绑定表达式