一.学习视频来源:
- https://www.bilibili.com/video/BV1sJ41127EMlongway777
- 导包
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-beta01'
二. ViewModel
1. ViewModel-jetpack(androidx库的一个组件)中的一个类传送门
2. 初始界面制作
- emmm这位up的脑洞好有意思,想起来以前用h5做遥控器
- 旋转屏幕时发现温度初始化变0了 ,
Activity未销毁,而是重新绘制了,当然也再次执行oncreate
,旋转生命周期
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var number=0
textView.text="0"
buttonPlus.setOnClickListener{
textView.text=(++number).toString()
}
buttonMinus.setOnClickListener{
textView.text=(--number).toString()
}
}
- **这个时候使用ViewModel,新建MyMiewModel类继承ViewModel,创建一个int属性的变量number
class MyViewModel:ViewModel() {
var number:Int=0
}
- 最后一步修改主MAC即可,控制view的number变量即可
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
textView.text=viewModel.number.toString()
buttonPlus.setOnClickListener{
viewModel.number++
textView.text=viewModel.number.toString()
}
buttonMinus.setOnClickListener{
viewModel.number--
textView.text=viewModel.number.toString()
}
}
}
3. 升级与通过LifeData控制(以后再补充)
- ViewModel
-
class MyViewModel:ViewModel() {
private val _number=MutableLiveData(0)
val number: LiveData<Int>
get()=_number
fun modifyNumber(aNumber:Int){
_number.value=_number.value?.plus(aNumber)
}
}
- MainActivity
1)这里建立了一个类,继承ViewModel()
2)规约,变量名带下划线为私有只读,建立公有的用于转换和set
a. 设置_内部私有,通过公有方法可赋值
b. 设置可访问的number,其值由_number赋予,无法直接拿到并对_number操作
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.number.observe(this, Observer { textView.text=it.toString() })
var number=0
textView.text="0"
buttonPlus.setOnClickListener{
viewModel.modifyNumber(1)
}
buttonMinus.setOnClickListener{
viewModel.modifyNumber(-1)
}
}
}
- 对比我们发现这种方式,view的number变化时不用在监听按钮中再次设置text的值,界面即可变化。