6392


例えばスマホ(縦)､(横)､タブレット(縦)､(横)の4つのレイアウトフォルダを作ることで実装するとします｡ そしてそれぞれのレイアウトは

  * スマホ(縦)  
`Fragment A`,`Fragment B`

  * スマホ(横)  
`Fragment A`

  * タブレット(縦)  
`Fragment A`,`Fragment C`

  * タブレット(横)  
`Fragment A`,`Fragment D`,`Fragment E`

となっています｡  
この内､`Fragment A`以外のフラグメントは`View`の表示内容にHttp通信で得られるデータを用います｡  
その､Http通信には`Volley`ライブラリを用います｡ `Volley`ライブラリはリクエスト時に`ApplicationContext`が必要です｡

この場合はどこでHttpリクエストをしたらよいのでしょうか｡  
例えば､親の`Activity`の`onCreate()`内でリクエストした場合､`Fragment`側にデータを送ることはできると思うのですが､すでに`Fragment`側の`onCreateView()`が終わっているはずなので`View`をセットすることがでないと考えられます｡  
また､`Fragment`でリクエストするとしましたら､`Fragment`側の`onCreateView()`では、まだ`Activity`の`onCreated()`が終わっていないため､`ApplicationContext`を取得できないと考えられます｡

こういった場合の実装方法を教えてください。よろしくお願い致します


CC BY-SA 3.0
2015-02-12T13:10:36.530
6387
2015-02-12T14:54:15.667
2015-02-12T13:37:41.967
7232
7232
question
android android-volley http android-layout android-fragments
Androidでスマホ､タブレット､縦､横で異なるLayoutを実現する｡


`Fragment`から、`Activity`の`onCreated()`が実行された後に行いたい処理がある場合は、[`onActivityCreated()`](http://developer.android.com/reference/android/app/Fragment.html#onActivityCreated\(android.os.Bundle\))のコールバックが利用できます。

この場合、`onCreateView()`で表示するビューは空か、もしくは読み込み中を表すインディケーターにして、後から更新することになるので、`Activity`の`onCreate()`で通信を行って、通信結果に応じて`Fragment`の表示を更新する作りにしてもあまり変わりませんが…。


CC BY-SA 3.0
2015-02-12T14:02:35.867
6392
2015-02-12T14:02:35.867
5337
6387
answer


やりたい事が「通信して表示」なので、`Loader`を使って次のように実装するのはどうでしょうか？

  1. 各`Fragment`の`onActivityCreated()`で、`LoaderManager`を取得し、`initLoader()`で初期化
  2. `initLoader()`の引数で指定する`LoaderCallbacks`の`onCreateLoader`で、「リクエストを`Volley`で投げて、データを取得する`Loader`」を生成
  3. 生成した`Loader`内で`Volley`を使ってリクエストを投げる。`Loader`のコンストラクタには`Context`があるので、`ApplicationContext`は取得できる
  4. リクエストの結果を`deliverResult()`で伝える。
  5. `LoaderCallbacks`の`onLoadFinished()`が呼ばれるので、`View`にそのデータをセットする 


CC BY-SA 3.0
2015-02-12T14:54:15.667
6396
2015-02-12T14:54:15.667
845
6387
answer