web-dev-qa-db-ja.com

フラグメントとバックスタックのアニメーション化

バックスタックからFragmentTransactionsをポップしてカスタムアニメーションを処理する方法の使用または理解に問題があります。具体的には、「out」アニメーションを呼び出すことを期待していますが、そうではないようです。

フラグメントを追加し、カスタムトランジションを適用して、フェードイン/フェードアウトするフラグメントトランザクション(FragmentTransaction)を処理する簡単な方法があります。また、ユーザーが戻るボタンでそのトランザクションを取り消すことができるように、これをバックスタックに追加し、基本的にフラグメントが追加される前の状態に移動します。

protected void changeFragment() { 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.setCustomAnimations(Android.R.anim.fade_in, Android.R.anim.fade_out); 
    ft.add(R.id.fragment_container, new TestFragment()); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

すべてが順調に進みますが、ユーザーが戻るボタンをクリックしても、遷移アニメーションは反転しません。フラグメントが削除されたときに、フェードアウトアニメーションが使用されることを期待していました。代わりに、(アニメーションなしで)ポップアウトし、コンテナがフェードインしているように見えます。これが正確に何であるかはわかりませんが、フラグメントは確実にフェードアウトしません。

私のアプリケーションは、互換性ライブラリを使用してフラグメントサポートを追加しますが、これはHoneycomb(Android-11)にも適用できると想定しています。私がここで何か間違ったことをしているのか、それとも期待しすぎているのか誰もが知っていますか?理想的には、メッセージをクリックして前進し、戻るボタンを使用して戻ることに関して、Gmail(Xoom上)が行う方法と同様に、フラグメントをアニメーション化したいと思います。戻るボタンの機能を無効にして自分のフラグメント状態に追いつく必要はありません。バックアウトしたいいくつかの「トランザクション」があり、車輪の再発明のファンではないためです。

Android Developers Group: http://groups.google.com/group/Android-developers/browse_thread/thread/1136a3a70fa0b6e9

54
Kelly Merrell

このバグは3.2リリースで修正され、次の新しいAPIが追加されました。

http://developer.Android.com/reference/Android/app/FragmentTransaction.html#setCustomAnimations(int、int、int、int)

互換性ライブラリにまだバックポートされていないことに注意してください(バグレポートに記載されています)。

29
kajham

私はこれを使用します:

ft.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

戻るボタンを押すと、トランジションが逆に機能します。

49
user742030

これはバグです。 バグレポート1562 をご覧ください。 Androidプロジェクトメンバーは、修正がリリース3.1には遅すぎたが、次のリリースに修正する必要があるとコメントしました。

同じメンバーが続けてこう言っています...

問題は、現在の場所にフラグメントを配置するために実行されたのと同じアニメーションがポップ操作で実行されることです。たとえば、上記のスライドの例では、前方操作(古いフラグメントをスタックにプッシュし、新しいフラグメントをビューに移動する)で、古いフラグメントを中央から左にスライドさせ、新しいフラグメントを中心部へ。スタックがポップされると、これらと同じアニメーションが実行されます。最新のフラグメントは、右から中央にスライドインすることで「アウト」されます(削除されると消えます)。古いフラグメントがスタックからポップされ、画面の中央から左へ、右から右へアニメーション表示されます。

5
Gallal