6

1 つを別のものに置き換えるフラグメントがいくつかあります。これらのフラグメントの UI が変更され、新しい状態を保持する必要があります。したがって、コードは非常に簡単に見えます。

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    if (mStepTwo == null) {
        mStepTwo = new QuizStepTwo();
        mStepTwo.setListener(mStepTwoListener);
    } else {
        fragmentTransaction.remove(mStepTwo);
    }

    fragmentTransaction.replace(R.id.step_holder, mStepTwo);
    fragmentTransaction.addToBackStack("second_step");

    fragmentTransaction.commit();

ただし、たとえば戻るボタンを押して、2 番目のステップを最初のステップに置き換えると、UI の状態が初期にロールバックされます。

状態を保持するにはどうすればよいですか? OnSaveInstanceState ? またはより快適なもの?

類似の質問:タブ ホスト内の Android フラグメント ビュー ステート、 Androidフラグメント ビュー ステートを復元する方法

4

5 に答える 5

3

使用していないので、走行距離は違うかもしれません。FragmentManager.saveFragmentInstanceStateフラグメントを置き換えるときにメソッドを使用してみてからFragment.setInitialSavedState、フラグメントを復元するときにメソッドを使用できます。ドキュメントから、同じタイプの新しい Fragment を作成する場合にのみ機能するように思われるため、現在の実装でこれが機能するかどうかは不明です。

于 2013-01-06T11:08:07.260 に答える
2

この質問 (およびその解決策)は、あなたがしようとしていることと似ています。

ただし、私が考えることができる別の解決策の 1 つは、最初のフラグメントを 2 番目のフラグメントに置き換えるのではなく ( で)非表示fragmentTransaction.hide()にするか、切り離すことです。そうすれば、ユーザーがフラグメントを押すBACKと、フラグメントが表示され、その状態はそのままになります。より多くのメモリが必要になる場合がありますが、フラグメントが破棄されないため、引き続き機能するはずです。

于 2013-01-06T06:44:04.930 に答える
1

状態がアプリ データに依存する場合は、それらを SharedPreferences ファイルに保存し、それを使用して UI 要素を構築することをお勧めします。

于 2012-12-29T09:36:29.060 に答える
0

追加と置換の違いは、前のフラグメントが一時停止または停止されていない場合に追加されることです。一方、フラグメントを置き換えようとすると、前のフラグメントは一時停止と停止のサイクルを経ます。しかし、それをスタックに入れると、前のフラグメントがスタックの一番上に保存されます。そして、バックプレスなどのイベントで取得およびロードされます。

したがって、ソリューションで UI を停止またはアンロードしないようにする必要がある場合は、UI を非表示にして、その上にフラグメントを追加する必要があります。または、フラグメントをアンロードしても問題がなく、何らかのタイプのパラメーターを使用して UI を再生成できる場合。したがって、フラグメントメモリ自体に、保持する必要がある統計を決定するパラメーターを含めることができます。デフォルトでは、何らかのデフォルト状態を保持しようとします。ただし、オブジェクトを作成してフラグメントにアタッチすることはできます。

onSaveInstanceState に関しては、フラグメントを含むアクティビティ、つまりホーム プレスなどのイベントが閉じられたときに呼び出されます。

例えば

public class MainActivityFragment1 extends Fragment {
    int alreadyCreated = 0;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        if (alreadyCreated == 1) { // restoreLayout();
            Log.i("MainActivity", " Fragment already created and can be restored Fragment 1");
        }else
            Log.i("MainActivity", " Running Once Fragment 1");

        alreadyCreated = 1;


    01-07 16:08:07.009: I/MainActivity(14722):  Running Once Fragment 1
    01-07 16:08:09.239: I/MainActivity(14722):  MainActivity I on pause
    01-07 16:08:09.239: I/MainActivity(14722):  MainActivity I on stop
    01-07 16:08:09.239: I/MainActivity(14722):  Running Once Fragment 2
    01-07 16:08:13.499: I/MainActivity(14722):  Back Pressed
    01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on pause
    01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on stop

01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on stop
01-07 16:08:13.619: I/MainActivity(14722):  MainActivity II on stop
01-07 16:08:13.619: I/MainActivity(14722):  Fragment already created and can be restored Fragment 1
于 2013-01-07T10:40:41.390 に答える