Fragment入れ替え時のアニメーション
1時間ほどはまったので、メモっておきます。
Fragmentを入れ替える時のお決まりの処理がこちらですね。
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment next = FragmentSample.newInstance();
ft.replace(R.id.fragment, next);
ft.addToBackStack(null);
ft.commit();
レイアウト上に配置されたfragmentという要素 (FrameLayout) にFragmentSampleというFragmentを上書きしています。Fragment遷移したいだけであればこれでおしまい。
でも動かしてみると分かるのですが、やっぱり遷移時にアニメーションさせたくなるのが人の常 (?) 。なので、はじめ安直にこんな感じでアニメーションを設定してみました。
FragmentTransaction ft = getFragmentManager().beginTransaction(); Fragment next = FragmentSample.newInstance(); ft.replace(R.id.fragment, next); // ↓ここから追加 ft.setCustomAnimations( R.anim.fragment_slide_right_enter, R.anim.fragment_slide_left_exit, R.anim.fragment_slide_left_enter, R.anim.fragment_slide_right_exit); // ↑ここまで追加 ft.addToBackStack(null); ft.commit();
・・・?あれれ、アニメーションしない。。。ということで一時間ほど悩んだわけです。答えは簡単。replaceの前にsetCustomAnimationsしないといけませんでした。
FragmentTransaction ft = getFragmentManager().beginTransaction(); Fragment next = FragmentSample.newInstance(); // ↓ここに移動 ft.setCustomAnimations( R.anim.fragment_slide_right_enter, R.anim.fragment_slide_left_exit, R.anim.fragment_slide_left_enter, R.anim.fragment_slide_right_exit); // ↑ここに移動 ft.replace(R.id.fragment, next); ft.addToBackStack(null); ft.commit();
めでたし、めでたし。
support-v4-demoのサンプルコードを見てみると確かにreplace前にsetCustomAnimationsしてました。ちゃんと見なきゃダメですねぇ (to 自分)。