2

私のアプリケーションの主要部分では、一度に 2 つのフラグメントを開いています。ただし、一度に表示されるのは 1 つだけです。

2 番目のフラグメントは、最初のフラグメントを制御するために使用されるため、最初のフラグメントの onCreateView メソッドから作成されます。

        Bundle args = new Bundle();
        args.putInt(ReferenceSelectorFragment.ARG_TAB_INDEX, Tab.BOOK.position);
        mReferenceSelectorFragment.setArguments(args);
        fm.beginTransaction()
                .add(container.getId(), mReferenceSelectorFragment, FRAGMENT_TAGS[0])
                .hide(mReferenceSelectorFragment)
                .commit();

フラグメントトランザクションを使用して、フラグメントを適切に非表示および表示しています。

getActivity().getSupportFragmentManager().beginTransaction()
                .setCustomAnimations(R.anim.up_in, R.anim.up_out, R.anim.down_in, R.anim.down_out)
                .hide(ReaderFragment.this)
                .show(mReferenceSelectorFragment)
                .addToBackStack(null)
                .commit();

これは、1 つの小さな欠陥を除いて、期待どおりにうまく機能します。アプリケーションがしばらく最小化され、OS がプロセスを閉じると、アプリケーションが再び開かれると、以前の状態を復元しようとすると、両方のフラグメントが重ねて復元されます。つまり、両方が同時に重なって表示されます。(これは、アプリのホーム ボタンを押してから、DDMS を使用して実行中のプロセスを強制終了することで再現できます)。

これを検出して修正するためにあらゆることを試みましたが、ローテーションと、プロセスが終了した後に復元されるアプリケーションをプログラムで区別することは非常に難しいことが証明されています。フラグメントの表示と非表示のライフサイクルを処理する適切な方法は何ですか?

4

1 に答える 1

0

これはあなたを助けるかもしれません: https://stackoverflow.com/a/13306633/969325

基本的に、アクティビティに null バンドルを渡すことができます super.onCreate(savedInstanceState); または、フラグメントがまだ存在しない場合にのみ新しいフラグメントを作成します。それがあなたの問題だと思います。

于 2013-09-20T13:35:49.923 に答える