
![]() | 新品価格 |

マスタカです。
androidでtabをFragmentで実装すると
タブがたまに二重に表示されることがある。
このバグがどうにも取れないので
長い時間はまっていたがどうやら解決策が見つかったぽいのでメモ。
前提としてマスタカは以下の方法でタブを実装していた。
http://masterka.seesaa.net/pages/user/search/?keyword=fragment&vs=http%3A%2F%2Fmasterka.seesaa.net%2F&fr=sb-sesa&ei=Shift_JIS
最初のうちは、どうにも分からなかったので
以下の方法でリスナーでタブをくっつけるように変更した。
http://yan-note.blogspot.jp/2012/12/android-actionbarfragmenttabfragmentonc.html
上のサイトの方法の肝は、既にあるfragmentを使い回すという点
既にfragmentがくっついていたら、追加せずにそのままにし
fragmentがnullだったらfragmentを作るという方法。
これによって、少なくとも同じfragmentは追加されないようになった。
で解決したかに思ったが、またFragmentが二重に表示される状態になった。
上記の方法だと以下の問題が発生する
1.一番左でないタブを選択
2.ホームボタンで戻る
3.たくさんアプリ開く
4.再度作成したアプリを開く
5.アプリのactivityのcreateが呼ばれる。
6.1で選んだ一番左でないfragmentのonCreateが呼ばれ表示される
7.一番左のタブが表示
8.結論として、タブが複数表示される
分かっているのは、
activityのonCreateは二回呼ばれる
該当のfragmentのonDestroyは呼ばれずに
再度Fragmentの初期化処理が走る。なぜかonCreateから。
理由だけ確定していないのだが
framgentがDestroyされてないとfragmentがついたままで描画処理が走るのかな?
fragmentのdestroyは以下の方法でできる
http://stackoverflow.com/questions/7119203/how-to-destroy-fragment
なので、上のサイトのコンストラクタでmFragmentがnullでない場合に以下の処理を追加する
if (mFragment != null && mFragment.isAdded()) {
FragmentManager fm = mActivity.getFragmentManager();
fm.beginTransaction().remove(mFragment).commit();
mFragment = null;
}
これで表示されているfragmentをdestroyして
nullになるので再度描画処理がきちんと動く訳です。
本当はresumeとpauseできちんと分けた方がメモリ管理的には良さそう。
できればonStopでやりたがったが、
activity has been destroyed
でFragmentManagerは触れない。
これでfragmentの二重に表示されるのはすべて解決できたかな?
しばらく様子見。
Javaだからメモリ管理しなくてもよいけど
メモリ管理は頭の中で考える必要があるってことですかね(・ェ・`)
タグ:android