大放光彩的安卓Jetpack组件-ViewModel(终)

207 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情,希望大家多多支持,帮忙点个赞,谢谢!

开场白

前面我们已经说过Jetpack中ViewModel的作用、用法以及使用要点,但还缺少在Activity中的实例展示,所以本节我们将结合结果展示与代码进行解读,希望能更好的展示出ViewModel的风采。

粉墨登场

上节,我只把ViewModelProvider.Factory的代码贴出,但没有给实例方法,所以我先把实例方法给贴出来,如下:

class MainActivity : AppCompatActivity() {

    lateinit var viewModel: MainViewModel
    lateinit var sp : SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sp = getPreferences(Context.MODE_PRIVATE)
        var countReserved = sp.getInt("count_reserved", 0)
        viewModel = ViewModelProvider(this, MainViewModelFactory(countReserved))
            .get(MainViewModel::class.java)
        var plusOneBtn : Button = findViewById(R.id.plusOneBtn)
        var clearBtn : Button = findViewById(R.id.clearBtn)
        plusOneBtn.setOnClickListener {
            viewModel.counter++
            reFreshCounter()
        }

        clearBtn.setOnClickListener {
            viewModel.counter = 0
            reFreshCounter()
        }
        reFreshCounter()
    }

    override fun onPause() {
        super.onPause()
        sp.edit {
            putInt("count_reserved", viewModel.counter)
        }
    }

    private fun reFreshCounter() {
        var infoText : TextView = findViewById(R.id.infoText)
        infoText.text = viewModel.counter.toString()
    }
}

这里给出了实例方法:
viewModel = ViewModelProvider(this, MainViewModelFactory(countReserved)) .get(MainViewModel::class.java)

就是把MainViewModelFactory给实例化从而实例化了ViewModel,这样对countReserved的操作就能向ViewModel中传递参数。
不过除此以外,我们还用到了安卓常用的SharedPreferences存储,首先获取了它的实例,从而可以读取之前保存的数值或者无记录时使用默认值0。
接下来在ViewModelProvider中,额外传入MainViewModelFactory参数(viewmodel实例中),将读到的数值传给MainViewModelFactory的构造函数,要注意的是,只有用这种写法才能将数组最终传递给了MainViewModel的构造函数,切记不可直接传递。

讲完这部分后,我先把xml代码贴出,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/infoText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="32sp"/>

    <Button
        android:id="@+id/plusOneBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Plus One"/>
    <Button
        android:id="@+id/clearBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Clear"/>

</LinearLayout>

这样我就可以说明一下,这些代码最终实现的效果。
最终其实就是一个计数器的实现,功能就是第一个plus one 按钮可以每点击一次数值加一 clear按钮则是直接清零,效果如下:

untitled.gif

如此一来,我们就用三篇将ViewModel基本内容都掌握了.

结语

这三篇中我们接触了第一个Jetpack组件,接下来我们将去接触另一个非常重要的组件--Lifecycles。