上篇发现了Navigation中切换Fragment的时候,无法保存参数。这里使用Jetpack中的ViewModel进行解决。
ViewModel是Jectpack中用于保存数据的库。具体使用方式后续会写其余文档
本篇主要实现的效果是进入第二个页面时,点击按钮统计点击次数,并在以后的切换中,这个数据能够保存
依赖方式添加有两种方式,具体写法不同
- lifecycle-extensions:
implementation "androidx.lifecycle:lifecycle-extensions:2.1.0"//ViewModelProviders位于这个包
-
lifecycle-viewmodel-ktx
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0-rc02'//注意版本号,后面的写法在这个版本之前没有,以后的写法可能都会使用这种
开启kotlin 1.8编译模式(部分kotlin写法需要开启该选项)
android {
kotlinOptions {
jvmTarget = "1.8"
}
}
修改fragment_item2.xml代码如下:
fragment_item2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是第二个页面,去第三个Fragment"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/click_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击次数"
/>
</LinearLayout>
添加ViewModel.kt
class TestViewModel: ViewModel(){
var clickCount = "点击次数:0"
}
修改MainPage2Fragment.kt
class MainPage2Fragment : Fragment() {
private val args: MainPage2FragmentArgs by navArgs()
private var clickCount = 0
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.fragment_item2, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
content.text = "获取的参数:${args.page2}"
val args = MainPage3FragmentArgs("哈哈")
// lifecycle-extensions 写法
// 生命周期为activity
// val model = activity?.let { ViewModelProviders.of(it).get(TestViewModel::class.java) }
// 生命周期为Fragment
// val model = ViewModelProviders.of(this).get(TestViewModel::class.java)
// lifecycle-viewmodel 写法,2.2.0-rc02 之后可以使用
// 生命周期为Activity
// val model = ViewModelProvider(requireActivity()).get(TestViewModel::class.java)
// 生命周期为Fragment
// val model = ViewModelProvider(this).get(TestViewModel::class.java)
// lifecycle-viewmodel_ktx依赖写法
// 这种写法需要开机kotlin 1.8选项
val model = ViewModelProvider(this).get<TestViewModel>()
click_count.text = model?.clickCount
go.setOnClickListener {
findNavController().navigate(R.id.page2action,args.toBundle())
}
click_count.setOnClickListener {
clickCount++
click_count.text = "点击次数:${clickCount}"
model?.clickCount = "点击次数:${clickCount}"
}
}
}
可以看到对于点击次数的统计进行了重复定义,这个问题下篇进行解决