1. ホーム
  2. android

[解決済み] トランジションアニメーションでネストされたフラグメントが消える

2023-01-12 07:57:35

質問

以下はシナリオである。アクティビティにフラグメント A を含み、その中で getChildFragmentManager() を追加して A1A2 で、その onCreate のように

getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.fragmentOneHolder, new FragmentA1())
  .replace(R.id.fragmentTwoHolder, new FragmentA2())
  .commit()

ここまでは順調で、すべてが期待通りに動いています。

次に、Activityで次のトランザクションを実行します。

getSupportFragmentManager()
  .beginTransaction()
  .setCustomAnimations(anim1, anim2, anim1, anim2)
  .replace(R.id.fragmentHolder, new FragmentB())
  .addToBackStack(null)
  .commit()

遷移の間 enter のアニメーションは、フラグメント B は正しく実行されますが フラグメント A1 と A2 は完全に消滅します。 . 戻るボタンでトランザクションを元に戻すと、それらは正しく初期化され popEnter のアニメーションの間、正常に表示されます。

私の簡単なテストでは、もっと奇妙なことになりました - 子フラグメントにアニメーションを設定すると (以下を参照)、子フラグメントの exit のアニメーションが断続的に実行されます。 B

getChildFragmentManager()
  .beginTransaction()
  .setCustomAnimations(enter, exit)
  .replace(R.id.fragmentOneHolder, new FragmentA1())
  .replace(R.id.fragmentTwoHolder, new FragmentA2())
  .commit()

私が実現したい効果は単純です。 exit (あるいは popExit ) フラグメントのアニメーション A (anim2) を実行し、入れ子の子も含めてコンテナ全体をアニメーション化します。

それを実現する方法はあるのでしょうか?

編集 : テストケースを探してください ここで

編集2 : 静的アニメーションを試行し続けるよう私を後押ししてくれた @StevenByle に感謝します。どうやら、アニメーションを(トランザクション全体に対してグローバルではなく)オペレーティング単位で設定できるようです。つまり、子には無期限の静的アニメーションを設定でき、親には別のアニメーションを設定でき、全体を1つのトランザクションでコミットできるのです。以下の議論を参照し 更新されたテストケース プロジェクト .

どのように解決するのですか?

トランザクションで親フラグメントが削除/置換されたときに、ネストされたフラグメントが消えるのをユーザーに見せないようにするには、それらのフラグメントの画像を提供し、画面に表示されているように、それらのフラグメントがまだ存在していることをシミュレートすることができます。この画像は、ネストされたフラグメント・コンテナの背景として使用されるので、ネストされたフラグメントのビューが消えても、画像はその存在をシミュレートすることができます。また、ネストされたフラグメントのビューのインタラクティブ性が失われることが問題であるとは思いません。

を作ったのですが の小さな例 を作成し、背景画像を設定しました(基本的なものです)。