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

朝陽楊大爺發表於2019-05-05

背景

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

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

這樣就會出現一個問題,可能我們之前的OneFragment儲存一些狀態或者資料,當我們跳轉OneFragment的時候,因為建立新的例項導致我們之前儲存狀態或者資料全部消失。

popUpTo/popUpToInclusive

在action當中設定兩個屬性

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

我們可以實現如下的效果:

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

注意如果要實現以上效果我們應該注意一下幾個地方:
1.如果我們用Kotlin語言,那麼我們在gradle當中引用的地方的類庫,需要改成

  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當中呼叫的方法為:

        findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
複製程式碼

注意這裡,引用的findNavController包為:

import androidx.navigation.fragment.findNavController
複製程式碼

3.resource id替換為action id 看過我之前程式碼的同學,可能會注意到我特意強調

 findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
複製程式碼

這裡的id最好用action id,這一種可以配合著action裡的動畫使用,當然也可以配合著action裡的屬性popUpTo popUpToInclusive來使用。
之前有位同學在公共號給我留言,問下了Demo之後,為什麼設定 popUpTo/popUpToInclusive不起作用,問題就在這裡應該是action Id
程式碼我已經更新,歡迎star和下載。如有問題歡迎給我留言!

問題依舊....

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

歡迎關注公共號

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

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

相關文章