GraveDollの備忘録ブログ

勉強したことや捗るグッズの備忘録です。

onResume()内でFragmentをreplace()しても画面に反映されない

@Override
public void onResume() {
        super.onResume();
	// 初期値をBundleにセット
	Bundle b = new Bundle();
	b.putString("name", "gravedoll");
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        MyFragment newFragment = new MyFragment();
        newFragment.setArguments(b);
        // Fragmentの置き換え(更新)
        fragmentTransaction.replace(R.id.myFragment,newFragment);
        fragmentTransaction.commit();
}

このように、Fragmentを同じインスタンスでreplace()することで更新をおこないたい場合があると思います(アプリがバックスタックから復帰するときなど)。
しかしonResume()内でreplace()しても、Bundleの取得ができているにもかかわらず画面に反映されないことがありました。
調べてみると・・・

Y.A.M の 雑記帳: Android FragmentTransaction のまとめ

置き換えられる Fragment と置き換える fragment が同じインスタンスの場合、onResume() まで呼ばれるが View が表示されないことがある

どうやらViewの反映が保証されていないようです。
困ったときのStackOverflowを見ると、removeAllViews()を使えという回答がありました。
そこでFragment内で

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
	Bundle savedInstanceState) {
		super.onCreateView(inflater, container, savedInstanceState);
                //一回Viewを取り外す
                container.removeAllViews()
		View rootView = inflater.inflate(R.layout.my_fragment, container,false);
		return rootView;

	}


としてやれば無事に更新が画面に反映されました。