読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

FragmentをReplaceすると上に重なってしまう問題

Android

すげー微妙だなこのreplaceメソッド・・・

僕はsupport v4ライブラリではなく、android.app.パッケージにあるやつを使ってます。で、fragmentをreplaceしようとしたら、replaceする度にスタックが上に積み上がり画面がどんどんオーバーレイしていくというよくわからない状態になってしまいました。

//こうやるとオーバーレイ(重なってしまう)
 getFragmentManager().beginTransaction()
    .replace(R.id.fragment01, newFragment)
    .commit();

確認してないけど、多分こーゆーのってTapのイベントを拾った場合は後ろに隠れているFragmentもTapイベントのリスナーを実装してる場合は拾っちゃう気がする。GUIアプリってそーゆーもん。

ドロワーから選択するときに選択されたポジションによってfragmentを切り替えたいだけなので、Fragmentを追加する時にタグを仕込んで、仕込んだタグでremoveしてからaddすればいいという結論に達しました。

        Fragment fragment;
        switch (position) {
            case 0:
                fragment = new AFragment();
                break;
            case 1:
                fragment = new BFragment();
                break;
            case 2:
                fragment = new CFragment();
                break;
            default:
                break;
        }
        String newTag = Integer.toString(position);
        Fragment current = fragmentManager.findFragmentByTag(currentFragMentTag);
        //タグで現在のfragmentを取得して消して、新しいタグを追加して常に1個の
        //Fragmentのremove/addにする
        fragmentManager.beginTransaction()
                .remove(current)
                .add(R.id.mainlayout,fragment,newTag)
                .commit();
        currentFragMentTag = newTag;
    }

currentFragMentTagはActivityのStringのメンバ変数です。onCreateとかでFragmentを突っ込む時に0で初期化しておいた。面倒いからポジションをそのままTagにした。これで今の所大丈夫そう。当方Android暦が現時点で延べ1週間ぐらいなので、難しいことはワカンネ。