1.视频来:
https://www.bilibili.com/video/BV1sJ41127EMlongway777
2. 具体操作
- emmm这位up的脑洞好有意思,想起来以前用h5做遥控器
- 旋转屏幕时发现温度初始化了 ,Activity未销毁,而是重新绘制了,当然也再次执行oncreate,旋转生命周期
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var number=0
textView.text="0"
buttonPlus.setOnClickListener{
//打开发现里面没有未实现的方法 it提示指当前的view
textView.text=(++number).toString()
}
buttonMinus.setOnClickListener{
//打开发现里面没有未实现的方法 it提示指当前的view
textView.text=(--number).toString()
}
}
- 这个时候使用ViewModel:存储和管理 UI 相关数据,程序不销毁(ondestory),VM保存的数据不消失
1)这里建立了一个类,继承ViewModel()
1.1)规约,变量名带下划线为私有只读,建立公有的用于转换和set
a. 设置_内部私有,通过公有方法可赋值
b. 设置可访问的number,其值由_number赋予,无法直接拿到并对_number操作
class MyViewModel:ViewModel() {
/*val number:MutableLiveData<Int>
init {
number= MutableLiveData()
number.value=0
}*/
// val number:MutableLiveData<Int> by lazy { MutableLiveData<Int>().also { it.value=0 } }//.also惰性加载初始化
private val _number=MutableLiveData(0)//新版本提供非惰性加载的初始化
val number: LiveData<Int>//外界可读,写
get()=_number//设置这个中转站
fun modifyNumber(aNumber:Int){
_number.value=_number.value?.plus(aNumber)//kotlin+改写
}//下划线表内部私有
}
2)回到AC,声明ViewModel并且动态绑定控件显示,修改
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() })//it指value 这里读出来的number是不可修改,只读的,只有get方法等于_number
var number=0
textView.text="0"
buttonPlus.setOnClickListener{
//打开发现里面没有未实现的方法 it提示指当前的view
//textView.text=(++number).toString()
viewModel.modifyNumber(1)
}
buttonMinus.setOnClickListener{
//打开发现里面没有未实现的方法 it提示指当前的view
//textView.text=(--number).toString()
viewModel.modifyNumber(-1)
}
}