close

前陣子我們剛使用 Android Jetpack 的 Navigation 吧

點我看第一篇  Android Kotlin/Java Jetpack Navigation 介紹、入門教學 example、sample code 實作範例』Willy's Fish教學筆記

點我看第二篇 Android Kotlin/Java Jetpack Navigation (二) Safe Args 介紹、入門教學 example、sample code 實作範例』Willy's Fish教學筆記

 

基本的使用我們都學會了

不過開發中可不能只有基本

像最近就遇到一些頁面管理的疑問

 

我們用 Google 的 Sample 來讓大家理解問題,流程如下圖

依流程, 我們到了 winner 頁時,跳回 match 頁

這時按 back 又退回 winner 頁的話

是不是會讓使用者一頭霧水

圖片連結:https://github.com/android/architecture-components-samples/blob/master/NavigationBasicSample/screenshot.png

screenshot.png

 

這問題應該會很容易遇到

例如 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


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()