Gdzie Fragment zapisuje swój stan, gdy FragmentTransaction.Replace?

Backgroud: mam menu po lewej stronie i różne przewijalne treści po prawej. chciałem zapisać przewijaną pozycję. Ale zawiodłem. Następnie ...

Przygotowałem bardzo prosty projekt, aby go przetestować.

Słowami, mam menu po lewej stronie, a różne treści - wszystkie<EditText> po prawej. (tej samej klasy są jednak różnych instancji)

W kodach(bardzo prosty)

content.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="Please save my text ..." />

ContentFragment.java

package ... import ...

public class ContentFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.content, container, false);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        System.out.println("Why this is NOT called ?");
        Log.v("onSaveInstanceState()", "outState = " + outState);
    }
}

i wygenerowany programMenuFragment.java

package ... import ...

public class MenuFragment extends ListFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, new String[]{"Item 1", "Item 2", "Item 3"}));
    }
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        ((MainActivity) getActivity()).click();
    }
}

Na koniec naszaMainActivity.java

package ... import ...

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null)
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.menu, new MenuFragment()).commit();
    }
    public void click() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content, new ContentFragment()  // everytime load a new instance
                ).addToBackStack(null).commit();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        System.out.println("... and this is NOT called neither :-/");
        Log.v("onSaveInstanceState()", "outState = " + outState);
    }
}

Aby to przetestować, NIE obracaj urządzenia.

Najpierw wybierz element z menu, a następnie wpisz coś w polu tekstowym. Następnie wybierz inny przedmiot i wpisz coś jeszcze raz. Powtórz to kilka razy. Następnie nawiguj wstecz i ...

znajdziesz swoje teksty wcześniej wpisaneSĄ ZAPISANE !!!

Nic dziwnego, że teksty są zapisywane ...

Ale tojest zaskoczony, że teksty zostały zapisaneze wszystkimionSaveInstanceState() funkcje NIE wywołane.

Kiedy Android je zapisałreplaced przezFragmentTransaction?

Jeśli chcę dodatkowo zapisać niektóre dane w każdymFragment przykład (jak pozycja przewijania), gdzie powinienem umieścić moje kody?

questionAnswers(1)

yourAnswerToTheQuestion