2013年04月12日

androidでタブをFragmentで実礎したらFragmentが二重に表示される

blogramランキング参加中!

Androidアプリテスト技法

新品価格
¥2,310から
(2013/4/12 20:10時点)



マスタカです。
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
posted by マスタカ at 20:11 | Comment(0) | TrackBack(0) | PC・携帯 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。