粉墨登场
上节,我只把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按钮则是直接清零,效果如下:
网络异常,图片无法展示
|
如此一来,我们就用三篇将ViewModel基本内容都掌握了.
结语
这三篇中我们接触了第一个Jetpack组件,接下来我们将去接触另一个非常重要的组件--Lifecycles。