【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的值,界面即可变化。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章