週末,有位同窗在微信公共號後臺,給我留言,說看了我以前寫兩篇文章,谷歌官方組件Navigation你瞭解了嗎?、谷歌官方組件Navigation你會用了嗎?以後,也在嘗試使用Navigation,可是使用的過程中遇到了問題:
每次進入下一個Fragment無論任務棧裏是否存在該Fragment的實例,都會建立一個新的實例而不會複用。
爲了說明問題,我錄了一個GIF android
這樣就會出現一個問題,可能咱們以前的OneFragment保存一些狀態或者數據,當咱們跳轉OneFragment的時候,由於建立新的實例致使咱們以前保存狀態或者數據所有消失。bash
在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