【Jetpack-一】ViewModel保存信息學習筆記

一.學習視頻來源:

  1. https://www.bilibili.com/video/BV1sJ41127EMlongway777
  2. 導包 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-beta01'

二. ViewModel

1. ViewModel-jetpack(androidx庫的一個組件)中的一個類傳送門

在這裏插入圖片描述

2. 初始界面製作

  1. emmm這位up的腦洞好有意思,想起來以前用h5做遙控器
  2. 旋轉屏幕時發現溫度初始化變0了 ,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()
        }
    }

在這裏插入圖片描述

  1. **這個時候使用ViewModel,新建MyMiewModel類繼承ViewModel,創建一個int屬性的變量number
class MyViewModel:ViewModel() {

    var number:Int=0

}
  1. 最後一步修改主MAC即可,控制view的number變量即可
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //創建    ViewModel對象 當重新繪製時從viewmodel中取出
        val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
        textView.text=viewModel.number.toString()
        
        buttonPlus.setOnClickListener{
         
            viewModel.number++
            textView.text=viewModel.number.toString()
        }

        buttonMinus.setOnClickListener{
            //打開發現裏面沒有未實現的方法 it提示指當前的view
            //textView.text=(--number).toString()
            //viewModel.modifyNumber(-1)
            viewModel.number--
            textView.text=viewModel.number.toString()
        }
    }
}

3. 升級與通過LifeData控制(以後再補充)

  1. ViewModel
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+改寫
    }//下劃線表內部私有 
    
}
  1. 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)
        //創建    ViewModel對象
        val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

         //lifedata聯動
        viewModel.number.observe(this, Observer { textView.text=it.toString() })//it指value
        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)
        }
    }
}
  1. 對比我們發現這種方式,view的number變化時不用在監聽按鈕中再次設置text的值,界面即可變化。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章