面试题答案
一键面试- ViewModel将数据传递给视图层
- 使用LiveData:
- 在ViewModel中,定义一个LiveData对象来存储UI相关的数据。例如:
- 使用LiveData:
class MyViewModel : ViewModel() {
val myData: LiveData<String> = MutableLiveData<String>()
}
这里MutableLiveData
是LiveData
的一个子类,它可以被修改,而普通的LiveData
一旦设置值后,外部无法修改。
- 在视图层(如Activity或Fragment)中,通过observe
方法观察这个LiveData对象。
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.myData.observe(this, Observer { data ->
// 这里的data就是ViewModel中myData LiveData的值
// 可以更新UI,比如设置TextView的文本
textView.text = data
})
}
}
当ViewModel中的myData
(即MutableLiveData
)的值发生变化时,通过setValue
(在主线程)或postValue
(在非主线程)方法更新值,视图层观察到变化后就会自动更新UI。
- ViewModel从视图层接收用户操作反馈并处理
- 在视图层监听用户操作:在视图层(Activity或Fragment)中为UI组件设置监听器。例如,对于一个按钮:
button.setOnClickListener {
// 将用户操作反馈传递给ViewModel
viewModel.onButtonClicked()
}
- 在ViewModel中处理用户操作:在ViewModel中定义处理用户操作的方法。例如:
class MyViewModel : ViewModel() {
private val _myData = MutableLiveData<String>()
val myData: LiveData<String> = _myData
fun onButtonClicked() {
// 处理用户点击按钮的逻辑
_myData.value = "Button Clicked"
}
}
这里当按钮被点击时,onButtonClicked
方法被调用,它可以执行一些业务逻辑,然后通过修改MutableLiveData
(这里是_myData
)的值,进而将新的数据传递给视图层,视图层通过observe
方法观察到数据变化后更新UI。