Android JetPack之Navigation(五)

上篇发现了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}"
        }
    }
}

可以看到对于点击次数的统计进行了重复定义,这个问题下篇进行解决

发布了132 篇原创文章 · 获赞 29 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/Mr_Tony/article/details/103346479