Navigation問題詳解——Fragment建立新的實例

背景

週末,有位同窗在微信公共號後臺,給我留言,說看了我以前寫兩篇文章,谷歌官方組件Navigation你瞭解了嗎?谷歌官方組件Navigation你會用了嗎?以後,也在嘗試使用Navigation,可是使用的過程中遇到了問題:
每次進入下一個Fragment無論任務棧裏是否存在該Fragment的實例,都會建立一個新的實例而不會複用。
爲了說明問題,我錄了一個GIF android

這樣就會出現一個問題,可能咱們以前的OneFragment保存一些狀態或者數據,當咱們跳轉OneFragment的時候,由於建立新的實例致使咱們以前保存狀態或者數據所有消失。bash

popUpTo/popUpToInclusive

在action當中設置兩個屬性微信

app:popUpTo="@id/oneFragment"
   app:popUpToInclusive="true"
複製代碼

咱們能夠實現以下的效果: app

注意若是要實現以上效果咱們應該注意一下幾個地方:
1.若是咱們用Kotlin語言,那麼咱們在gradle當中引用的地方的類庫,須要改爲post

implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version" // use -ktx for Kotlin
 implementation "android.arch.navigation:navigation-ui-ktx:$nav_version" // use -ktx for Kotlin
複製代碼

2.這樣咱們在Fragment當中調用的方法爲:gradle

findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
複製代碼

注意這裏,引用的findNavController包爲:動畫

import androidx.navigation.fragment.findNavController
複製代碼

3.resource id替換爲action id 看過我以前代碼的同窗,可能會注意到我特地強調ui

findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
複製代碼

這裏的id最好用action id,這一種能夠配合着action裏的動畫使用,固然也能夠配合着action裏的屬性popUpTo popUpToInclusive來使用。
以前有位同窗在公共號給我留言,問下了Demo以後,爲何設置 popUpTo/popUpToInclusive不起做用,問題就在這裏應該是action Id
代碼我已經更新,歡迎star和下載。若有問題歡迎給我留言!spa

問題依舊....

看似,咱們在回退的時候,正常了。可是,咱們的問題依舊存在,每次點擊的時候依然會建立一個新的Fragment,一個新的實例,只是咱們在建立新的實例的時候,把以前的給清除了而已。 我會在下一篇文章介紹如何解決這個問題!3d

歡迎關注公共號

關注公共號會有更多收穫!

相關文章
相關標籤/搜索