とりあえず移転してみました

ニュースねたや、IT系の記事を書いていくつもり・・・ですが、どうなるかわかりません。まあ、とりあえず やってみます。

android Fragmentまとめなど

FragmentとViewPagerで、はまったところのまとめ。
TabLatoutを使用して、タブ内でFragmentを表示する際に色々とはまってしまった。

流れとしては、以下のような感じ

・画面1(Activity)からアクセスするURLを決定

・webアクセスを実行して、結果を取得

・結果の中から次にアクセスするURLを2つ取得する

・webアクセスを2回実行して、結果を次の画面2(Activity)に表示する

・画面2には、TabLayoutを配置して、結果の2つをそれぞれのFragmentに表示

こんな流れだけど、問題だったのはwebアクセスは非同期処理ということ・・・
結果が返ってきてから、次の画面を表示としたのだけど、webアクセスをして画面2を表示してから、結果が返ってきたら反映・・・と想定していたけど、なかなか困難だった。

結果的には、結果が返ってきてから画面2の表示を行った。


まずは、Fragmentのおさらい

基本の部分は、以下のリンクで確認できる
フラグメント | Android Developers

newInstanseで初期設定を行い、onCreateViewで表示が行われる。
はじめから、Fragmentを生成する段階で、表示する値などを渡すほうがいいと思うのだけど、その方法だとFragmentがなんらかの要因で再表示される際に、データがないため例外処理で落ちてしまうらしい・・・

そこで、newInstanseで表示データなどをBundleで渡しておけば、再表示でもBundleからデータを持ってくるのでエラーにならない。

Fragmentのこの仕様のため、基本的に表示するデータを取得してから、Fragmentを生成しないと面倒。
TabLayoutを使う場合には、更にViewPagerAdapterを使ってFragmentを管理するので、ViewPagerAdapterから初期値を渡すことになる。

ViewPagerAdapterにBundleでデータを渡し、そのデータはViewPagerAdapterからFragmentにBundleでデータを渡す。
ListViewAdapterとかAdapterを使うことで、メリットは多いのだけど、データを渡すなどの処理を追加する場合は横断的に処理を行わないといけないので、面倒。

直接Fragmentにインターフェースを使って渡すことも可能なのだけど、Adapterが管理している以上はAdapterに処理を委譲しないと更新とかの処理が変になってしまう。