Upload
akiyoshi-samukawa
View
170
Download
7
Embed Size (px)
Citation preview
自己紹介
• 寒川 明好
• 株式会社ネクスト– HOME’S 事業本部
• Android 開発グループ– Tech Manager
• 2010 年入社– 入社後1年半は Web を担当– その後はアプリ開発メイン
• Android• iOS• Windows Phone
もくじ
HOME’S アプリの歴史
HOME‘S アプリにおける Activity と Fragment
デザインと Fragment の関係
画面遷移時のインターフェース
HOME‘S アプリにおける Fragment の課題と解決
最初の Activity と Fragment• 実は最初の設計では
Activity Only だった– それぞれの画面を機能として
独立させるため– ToolBar や Drawer の状態
を保ったまま画面遷移させたい• 画面ごとに Fragment を作成
• リリース当初は– 1 Activity– n Fragment
Fragment
View
1画面n Fragment• Fragment が保持する View に対して複数の
Fragment を Attach している画面もあった
• コンテンツが独立• タブレット考慮
↓
Support Library のバグで、Fragment が add した順番で反映されない!
ChildFragment[0]
ChildFragment[2]
ChildFragment[1]
• マテリアルデザインへのシフト– ToolBar
• OS3 ( Holo )以降では ActionBar として Activity で管理• OS5 ( Material )以降では ToolBar として Fragment で管
理– 画面ごとに UX が異なる
» 常に表示し続ける» スクロールすると ToolBar を非表示» CollapsingToolbarLayout を使ってスクロールするとヘッダー
が縮小される
↓
デザインと Fragment の関係
ベースとなる Activity から移植を開始Fragment で色々開発していたおかげで、機能単位で移植が簡単だった
現在の Activity と Fragment
• 現状は–機能ごとに Activity を用意–1画面で1 Fragment
※ 一部では複数の Fragment がある
• Activity–Main– Scheme– Detail– Setting
• 画面遷移時に要求するインターフェースを Fragment に定義
• インターフェースを実装した Activity や Fragment を遷移元の Fragment が保持
画面遷移時のインターフェース
interface
interface
interface
interface
Activity Fragment
HOME’S における Fragment の課題と解決
1. Fragment が大量にスタックされているため、画面回転時やアクティビティ破棄時の再生成が厄介OS7 から TransactionTooLargeException が
発生再生成時に、スタックされている Fragment で
Loader などが走ってしまう↓
画面を構成する Fragment の状態を管理するために UI を持たない Fragment を用意
し、 setRetainInstance(true) を使って状態保存に対応させる
HOME’S における Fragment の課題と解決
2. AsyncTask と Fragmentバックグラウンド中に画面回転させると
Fragment が破棄されてしまうFragment のインスタンスは残っているのに
ライフサイクル的には null になっている↓
画面回転しても Fragment を再生成させないように setRetainInstance(true) を使う
※ 注意• setRetainInstance(true) を使う場合は、 UI を持たない Fragment のみ• Fragment#onCreate() は呼ばれないけど、 onAttach() は呼ばれる• Activity は再生成されるので、 Activity#onCreate() で Fragment はセット
すると、都度 add されてしまう
HOME’S における Fragment の課題と解決
3. 複数人で開発しているので、 Fragmentの抽象クラスに View が紛れ込んでしまうDataBinding の導入がちょっと大変
4. 1画面1 Fragment の構成ボタン同時押しなどで画面遷移が複数走ってし
まう↓
splitMotionEvents(false) で抑制