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; }
としてやれば無事に更新が画面に反映されました。