home'sアプリのfragmentとデザインの関係 minami aoyama night #2

15
HOME’S アアアア Fragment アアアアアアアア NEXT Co.,Ltd. Akiyoshi Samukawa 2017.3.17 Minami Aoyama Night#2

Upload: akiyoshi-samukawa

Post on 11-Apr-2017

170 views

Category:

Technology


7 download

TRANSCRIPT

HOME’S アプリのFragment とデザインの関係

NEXT Co.,Ltd.Akiyoshi Samukawa

2017.3.17 Minami Aoyama Night#2

自己紹介

• 寒川 明好

• 株式会社ネクスト– HOME’S 事業本部

• Android 開発グループ– Tech Manager

• 2010 年入社– 入社後1年半は Web を担当– その後はアプリ開発メイン

• Android• iOS• Windows Phone

HOME’S ってなに?

物件数 No.1 ※1 の不動産・住宅情報サイト

※1 産経メディックス調査 (2017.1.26)

おかげさまでベストアプリ

もくじ

HOME’S アプリの歴史

HOME‘S アプリにおける Activity と Fragment

デザインと Fragment の関係

画面遷移時のインターフェース

HOME‘S アプリにおける Fragment の課題と解決

HOME‘S Android アプリの歴史

• 2014.9 にバージョン 1.0.0 がリリース• 現在は バージョン 5.7.0

最初の 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) で抑制

HOME’S における Fragment の課題と解決

5. Fragment の Button をタップしたら、DialogFragment を表示Button タップ時に、同時に BACK キー押し

たら、別の画面に DialogFragment が出てしまった

↓Fragment に紐づく Dialog なの

に、 Activity の FragmentManager に対して add していた。 Fragment の

ChildFragmentManager に変えることで対応