一.學習視頻來源:
- 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的值,界面即可變化。