2

この質問を書き直すことにしました:

私はそれらをABCと呼ぶ3つのフラグメントを持っています。それぞれはユーザーが記入するためのいくつかのフィールドを持つビューを持っています。ユーザーは、メニューを使用してさまざまなフラグメントを切り替えることができるはずです。ユーザーがフラグメントAに情報を入力してから、Cに切り替えると、さらに情報が入力されてからAに戻る場合、ユーザーがAに入力した情報はまだそこにあるはずです。

どういうわけかFragmentManagerを使用する必要があると思いますが、追加/置換/接続の正しい組み合わせを理解できません...それを希望どおりに機能させるために必要です。

誰かが、各フラグメントのビューステートを維持しながらフラグメントを切り替えることができるコードスニペットを提供できますか?

現在の実用的なソリューション:

mContentはアクティブなフラグメントであり、アクティビティのプライベートメンバー変数です。

このアプローチまたはそれをより効率的/より堅牢にする方法に何か問題があると誰かが見た場合は、私に知らせてください!

public void switchContent(String fragmentTag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    if ( fragmentManager.findFragmentByTag( fragmentTag ) != mContent ) {
        if ( !mContent.isDetached() ) {
            transaction.detach( mContent );
        }

        if ( fragmentManager.findFragmentByTag( fragmentTag ) == null ) {
            if ( fragmentTag.equals( "details" ) ) {
                mContent = ScheduleDetailsFragment.newInstance();
            } else if ( fragmentTag.equals( "notes" ) ) {
                mContent = ScheduleNotesFragment.newInstance();
            } else if ( fragmentTag.equals( "exceptions" ) ) {
                // @TODO - Create Exceptions Fragment
            }
        } else {
            mContent = ( SherlockFragment ) fragmentManager.findFragmentByTag( fragmentTag );
        }
        if ( mContent.isDetached() ) {
            transaction.attach( mContent );
        } else if ( !mContent.isAdded() ) {
            transaction.add( R.id.content_frame, mContent, fragmentTag );
        }

        transaction.commit();
    }
    getSlidingMenu().showContent();
}

ありがとう、ネイサン

4

1 に答える 1

1

提供された例の 1 つのコードに基づいていますが、メニュー項目がクリックされるたびに新しいフラグメントが返されるため、状態情報が失われます。

ページが何らかの状態/セッションを保持している場合、Fragmentナビゲーション イベントごとに新しいものを返すことは、ユーザー エクスペリエンスが非常に悪く、メモリの使用量にもあまり適していません。

FragmentManagerメインでを使用して、切り替えるActivityすべてのメニューを維持するために、スライド メニューを使用することをお勧めします。Fragmentsすべての状態を管理し、 を使用してそれらを取得できますfindFragmentByTag(String tag)Fragment追加した状態 (最初の作成後に変更された値/データ) をそれぞれが保存onSaveInstanceState(Bundle outState)し、onCreate(Bundle savedInstanceState). あなたが使用しているスライド メニューが現在それをどのように管理しているかはわかりません。そのため、これは不可能かもしれません。これが少なくとも正しい方向に進むのに役立つことを願っています.

編集:更新された質問に対する更新された回答 - を切り替える方法は次のとおりFragmentsです。置換を使用するとFragments、既に作成されているものを再利用しながら、完全に切り替えることができます。フラグメントの状態を保存/復元するには、上記の私の回答を参照する必要があります。Fragmentsそれが不明な場合は、およびで状態を保存する方法の例を検索してActivitiesください。

public void switchContent(String fragmentTag) {

    // If our current fragment is null, or the new fragment is different, we need to change our current fragment
    if (mContent == null || !mContent.getTag().equals(fragmentTag)) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        // Try to find the fragment we are switching to
        Fragment fragment = fragmentManager.findFragmentByTag(fragmentTag);

        // If the new fragment can't be found in the manager, create a new one
        if (fragment == null) {
            if (fragmentTag.equals("details")) {
                mContent = ScheduleDetailsFragment.newInstance();
            }
            else if (fragmentTag.equals("notes")) {
                mContent = ScheduleNotesFragment.newInstance();
            }
            else if (fragmentTag.equals("exceptions")) {
                // @TODO - Create Exceptions Fragment
            }
        }
        // Otherwise, we found our fragment in the manager, so we will reuse it
        else {
            mContent = (SherlockFragment) fragment;
        }

        // Replace our current fragment with the one we are changing to
        transaction.replace(R.id.content_frame, mContent, fragmentTag);
        transaction.commit();

        getSlidingMenu().showContent();
    }
    else {
        // Do nothing since we are already on the fragment being changed to
    }
}
于 2013-02-08T00:17:03.957 に答える