前陣子我們剛使用 Android Jetpack 的 Navigation 吧
點我看第一篇 Android Kotlin/Java Jetpack Navigation 介紹、入門教學 example、sample code 實作範例』Willy's Fish教學筆記
基本的使用我們都學會了
不過開發中可不能只有基本
像最近就遇到一些頁面管理的疑問
我們用 Google 的 Sample 來讓大家理解問題,流程如下圖
依流程, 我們到了 winner 頁時,跳回 match 頁
這時按 back 又退回 winner 頁的話
是不是會讓使用者一頭霧水
這問題應該會很容易遇到
例如 Launch 頁,跳到主頁後
按 back 卻又退回 Launch 頁 (無限循環~)
又或者註冊 step1 頁 -> step2 頁 -> step3 頁 -> 主頁
按 back 後,退回註冊 step3 頁
這就很怪了,都註冊成功了還回去 step3 (??)
為什麼會這樣呢?
這就要說到一個返回棧的概念 Back Stack
Navigation 會把經過的每一頁都加進 Back Stack
以剛剛我們註冊的例子 Back Stack 會像這樣
Back Stack = [ 主頁 -> step1 頁 -> step2 頁 -> step3 頁 -> 主頁 ]
可怕的是,這個 Stack 會一直越來越長,最後都不知連去哪了 XD
主角出現了,今天我們介紹兩個 action 的參數
app:popUpTo
app:popUpToInclusive
這兩個就是為了此狀況而生的救星
popUpTo 會把 Stack中的頁面 (Destinations) 都 pop 掉到指定頁為止。
popUpToInclusive 顧名思義就是要不要包含指定的頁面, 預設為 false
實際用法如下
<fragment
android:id="@+id/setp3Fragment"
。。。>
<action
。。。
app:destination="@id/mainFragment"
app:popUpTo="@id/mainFragment"
app:popUpToInclusive="false"/>
這樣的話,用到此 action 就會使剛剛的 Stack 發生變化
位於 step3 頁,Back Stack = [ 主頁 -> step1 頁 -> step2 頁 -> step3 頁 ]
未使用:
位於主頁,Back Stack = [ 主頁 -> step1 頁 -> step2 頁 -> step3 頁 -> 主頁again ]
使用後:
位於主頁,Back Stack = [ 主頁 -> 主頁again]
疑!? 為什麼兩層主頁
這時候我們設定 popUpToInusive = true ,原主頁也會被 pop 囉!!
如此就解決了頁面流程的問題
大家快去試試看
資料來源:
https://github.com/android/architecture-components-samples/tree/master/NavigationBasicSample
https://developer.android.com/guide/navigation/navigation-navigate
留言列表