TabLayout上でのFragmentManagerとBackstackの管理方法 / How to manage FragmentManager and Backstack on TabLayout
by
Yappli Developers
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
TabLayout 上での FragmentManagerと BackStackの管理 方 法
Slide 2
Slide 2 text
Speaker プロダクト開発本部 開発1部 Android グループ Android エンジニア 張 哲于 • 張哲于、ニックネーム「てつ」 • Android 歴約10年 (1.6から) • 仕事のモチベーションは、困っている 人 に 自 分も 欲しいものを作って届けること • 現在発信 力 を 高 める努 力 をしている
Slide 3
Slide 3 text
01 02 03 TabLayout の画 面 遷移でよく挙げられる要望 各要望の実装法とデモ実演 実装の注意点
Slide 4
Slide 4 text
0 1 TabLayout の画 面 遷移でよく挙げられる要望 アプリ内に 入 れたい機能が多い! 詳細ページや他の機能に遷移するルートが欲しい! これは作れるの?
Slide 5
Slide 5 text
ブレイクダウン 1 . ページの遷移と戻る 2 . 最初のページに戻る 3 . 一 個前のタブに戻る 4 . タブ内容の状態を維持する 5 . ページとタブの戻る動作が併存できる 0 1 TabLayout の画 面 遷移でよく挙げられる要望 タブ タブ タブ ページ
Slide 6
Slide 6 text
• Index: 0, Id: 0246787931 • Index: 1, Id: 234788107 • Index: 2, Id: 125561020 • Index: 3, Id: 14409808 1 Demo 02 各要望の実装法とデモ実演 - ページの遷移と戻る Fragment
Slide 7
Slide 7 text
1. ページの遷移と戻る - FragmentTransaction add() と replace()
Slide 8
Slide 8 text
1. ページの遷移と戻る - FragmentTransaction A B C D .add(A) .add(B) .add(D) A B C D D .replace(D) A B C
Slide 9
Slide 9 text
1. ページの遷移と戻る - FragmentTransaction FragmentTransaction. addToBackStack() と FragmentManager. popBackStack()
Slide 10
Slide 10 text
2 1. ページの遷移と戻る - FragmentTransaction Stack Index 0 Index 2 Index 1 Stack Index 0 Index 1 Index 2 add 実装
Slide 11
Slide 11 text
3 1. ページの遷移と戻る - FragmentTransaction pop Stack Index 0 Index 2 Index 1 Stack Index 0 Index 1 実装(続き)
Slide 12
Slide 12 text
• Index: 0, Id: 156988707 • Index: 1, Id: 101360987 • Index: 2, Id: 100894719 • Index: 3, id: 208129123 1 Demo 02 各要望の実装法とデモ実演 - 最初のページに戻る Fragment
Slide 13
Slide 13 text
2 2. 最初のページに戻る - FragmentManager pop all Stack Index 0 Index 2 Index 1 Stack 実装
Slide 14
Slide 14 text
2. 最初のページに戻る - FragmentManager ページ Fragment タブ Fragment FragmentManager FragmentManager FragmentActivity .supportFragmentManager .childFragmentManager .parentFragmentManager .parentFragmentManager 3 実装(続き)
Slide 15
Slide 15 text
• EMPTY (0) • CHILD (1) • KEEP (2) • CHILD (1) • KEEP (2) • EMPTY (0) 1 Demo 02 各要望の実装法とデモ実演 - タブの遷移と戻る Fragment
Slide 16
Slide 16 text
3. タブの遷移と戻る - FragmentManager ページ Fragment タブ Fragment FragmentManager FragmentManager FragmentActivity .supportFragmentManager .childFragmentManager .parentFragmentManager .parentFragmentManager 2 実装
Slide 17
Slide 17 text
• 入力 内容: 1234 • 回転前 → 回転後 • SaveState: なし → 1234 • ページ戻る • SaveState: なし 1 Demo 02 各要望の実装法とデモ実演 - タブ内容の状態を維持する Fragment
Slide 18
Slide 18 text
4. タブ内容の状態を維持する バックスタックに追加 構成の変更 (画 面 回転など) プロセス ライフサイクルの終了 変数 ✓ ✘ ✘ ✘ ViewState ✓ ✓ ✓ ✘ SaveState ✘ ✓ ✓ ✘ 2 データの状況
Slide 19
Slide 19 text
A B C ViewModel ViewState SaveState • 自身 の状態を管理する役割 • IDがあれば 自 動的に状態を保持する • カスタムビューの場合、他の実装が必要 • フラグメント動的状態を管理する役割 • Framgentライフサイクルでアクセス • ビジネスロジック、画 面 レベルの状態ホルダー • 画 面 の回転など構成が変更されたときの対応 手 段 • セーブステイトはSavedStateHandleで対応可能 4. タブ内容の状態を維持する
Slide 20
Slide 20 text
• EMPTY (0) index: 0 • CHILD (1) index: 0 • CHILD (1) index: 1 • CHILD (1) index: 2 • KEEP (2) index: 0 • CHILD (1) index: 2 →όοΫΞΫγϣϯ • CHILD (1) index: 1 1 Demo 02 各要望の実装法とデモ実演 - ページとタブの戻る動作が併存できる Fragment
Slide 21
Slide 21 text
Stack 5. ページとタブの戻る動作が併存できる ϖʔδ Stack (Child) Index 0 Index 1 Index 2 ϖʔδ Stack (Empty) ϖʔδ Stack (Keep) ϖʔδ Stack (Child) Index 0 Index 1 Index 2 2 BackStack
Slide 22
Slide 22 text
5. ページとタブの戻る動作が併存できる 3 実装
Slide 23
Slide 23 text
ҙ • Memory Leak が発 生 しやすい • Lifecycle よる不整合 03 実装の注意点
Slide 24
Slide 24 text
1 2 3 その他 なりやすい対象 検出 手 段 • ViewBinding • Receiver • ライブラリ:LeakCanary • WeakReferenceの利 用 1 . Memory Leak
Slide 25
Slide 25 text
• Activity と Fragment 内に追加する順番 • 例: • Activity側 → onCreate() • Fragment側 → onCreateView() 1 Lifecycle 2 . Lifecycle OnBackPressedDispatcher
Slide 26
Slide 26 text
• Component Scope • @ActivityScoped • @FragmentScoped 1 Lifecycle 2 . Lifecycle Dagger Hilt
Slide 27
Slide 27 text
https://github.com/iyotetsuya/TabLayout- Demo ソースコード
Slide 28
Slide 28 text
参考資料 •https://developer.android.com/guide/fragments/ •https://m3.material.io/components/tabs/overview
Slide 29
Slide 29 text
ご清聴ありがとうございました