-
他のフォルダのリソースを
オーバーライドすることについて学んだので
-
次はタブレット用の2ペインUIの
構築についてプログラムを見てみましょう
-
幅が820dpよりも大きいデバイスに
対応する必要がないので
-
まずvalues-w820dpフォルダを削除したあと
-
レイアウトのXMLファイルを変更します
-
そしてlayout-sw600dpフォルダを作り
-
activity_main.xmlというファイルを加えます
-
基底レイアウトフォルダの
activity_mainと同じファイル名を使います
-
それによりこのファイルが
タブレットでの振る舞いをオーバーライドします
-
このファイルのプログラムは下のGistで得られます
-
基本的に水平方向のLinearLayoutで
左側にForecastFragmentを
-
右側にDetailFragmentを表示します
-
ここで静的フラグメントと
動的フラグメントを説明します
-
実装ではForecastFragmentは
XMLレイアウトで定義しているので
-
静的フラグメントになります
-
デバイスの向きやサイズに関係なく
MainActivityにはForecastFragmentが必要です
-
一方DetailFragmentには実際の
Fragmentではなくコンテナの宣言だけを行います
-
DetailFragmentは動的フラグメントとして
毎回異なる引数で初期化されます
-
従ってDetailFragmentは
MainActivityのJavaコードの
-
フラグメントトランザクションの中で
動的に生成し追加するほうがいいのです
-
こうすればFragmentManagerは
これらの初期化の引数を記録し
-
デバイスが回転したあとで
これらの値を戻すことができます
-
それから2ペインUIレイアウトと一貫させるために
-
1ペインUIレイアウトの変更が必要になります
-
基底レイアウトフォルダの
activity_mainファイルの中のここは
-
以前はFrameLayoutでしたが
ForecastFragmentとして宣言します
-
こうするとXMLの中でFragmentとして
宣言されている2ペインUIと一致します
-
これでMainActivityは
ForecastFragmentを
-
動的に追加する必要はありません
-
MainActivityの実際のメソッド名は
onCreateViewメソッドです
-
Fragmentはすでに
このレイアウトの中にあるので
-
再びFragmentを動的に加えないよう
if文を削除します
-
同様に基底レイアウトフォルダの
activity_detail.xmlを変更します
-
FrameLayoutのIDを
weather_detail_containerに
-
変更することにより
2ペインUIのコンテナView IDと一致します
-
この形態では 2ペインと1ペインの両方において
-
DetailFragmentは常に
weather_detail_containerに追加されます
-
コンテナ名を変更したので
DetailActivityをアップデートしましょう
-
これは1ペインモードのみに使用され
ここがコンテナ名を変更した行です
-
1ペインモードではDetailActivityは
DetailFragmentを動的にこのコンテナに追加します
-
レイアウトを変更したあと
DetailFragmentを動的に加える変更を
-
MainActivityに加えます
-
MainActivityのonCreateメソッドで
weather_detail_containerの存在をチェックして
-
2ペインUIかどうか確認します
-
この情報をブール型変数のmTwoPaneに記録します
-
メンバ変数だからmで始まるのを覚えていますか
-
この場合ブール型変数はtrueになります
-
DetailFragmentを作成し
weather_detail_containerに追加します
-
レトが説明したように
フラグメントトランザクションを使って
-
変更をコミットします
-
weather_detail_containerが
レイアウトに存在しない場合は
-
ブール型変数はfalseとなり
スマートフォン用の1ペインUIであると分かります
-
この場合DetailActivityが
DetailFragmentを表示します
-
2ペインUIの場合は
savedInstanceStateがnullかどうかを調べます
-
savedInstanceStateがnullでない場合は
新しいDetailFragmentを作りません
-
理由を説明します
-
デバイスの向きを変えるとします
-
ActivityとFragmentが崩れる前に
-
情報をsavedStateBundleに格納します
-
デバイスの向きが変わったあとに
そのBundleを返すことによって
-
システムはActivityとFragmentを復元し
-
前と同じ状態を再構築できます
-
Bundleが存在する場合は
システムがDetailFragmentを復元するので
-
この部分のコードは飛ばします
-
DetailFragmentを動的に追加したら
-
テスト用のプレースホルダデータを
表示させてみてください
-
右側の日付の情報が左側に表示されるように
-
右側のロジックをあとで詳しく見ていきます
-
intentがデータURIを持っていることを
当てにしないように
-
DetailFragmentを変更してください
-
この場合DetailFragmentは
-
XMLにあるプレースホルダデータを
表示することになります
-
intentがnullになるのは
-
DetailFragmentがMainActivityの中に
存在する場合です
-
DetailActivityは通常
1つの日付のURIと一緒に起動されますが
-
MainActivityは違います
-
ワイヤーフレームに沿った変更ができたら
画面にはこのように表示されます
-
右上にアイコンが表示されないのは
-
レイアウトにハードコーディングしたものを
削除したからです
-
このあとデータが動的に埋め込まれるように
変更すれば再び表示されます