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)
}
}