Ich habe eine Dummy-Aktivität geschrieben, die zwischen zwei Fragmenten wechselt. Wenn Sie von FragmentA zu FragmentB wechseln, wird FragmentA zum Backstack hinzugefügt. Wenn ich jedoch zu FragmentA zurückkehre (durch Zurückdrücken), wird ein völlig neues FragmentA erstellt und der Zustand, in dem es sich befand, geht verloren. Ich habe das Gefühl , ich nach der gleichen Sache wie mich diese Frage, aber ich habe ein vollständiges Codebeispiel , um Hilfe Wurzel aus der Ausgabe enthalten:
public class FooActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentA());
transaction.commit();
}
public void nextFragment() {
final FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, new FragmentB());
transaction.addToBackStack(null);
transaction.commit();
}
public static class FragmentA extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View main = inflater.inflate(R.layout.main, container, false);
main.findViewById(R.id.next_fragment_button).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((FooActivity) getActivity()).nextFragment();
}
});
return main;
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save some state!
}
}
public static class FragmentB extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.b, container, false);
}
}
}
Mit einigen hinzugefügten Protokollnachrichten:
07-05 14:28:59.722 D/OMG ( 1260): FooActivity.onCreate
07-05 14:28:59.742 D/OMG ( 1260): FragmentA.onCreateView
07-05 14:28:59.742 D/OMG ( 1260): FooActivity.onResume
<Tap Button on FragmentA>
07-05 14:29:12.842 D/OMG ( 1260): FooActivity.nextFragment
07-05 14:29:12.852 D/OMG ( 1260): FragmentB.onCreateView
<Tap 'Back'>
07-05 14:29:16.792 D/OMG ( 1260): FragmentA.onCreateView
Es ruft niemals FragmentA.onSaveInstanceState auf und erstellt ein neues FragmentA, wenn Sie zurückschlagen. Wenn ich jedoch auf FragmentA bin und den Bildschirm sperre, wird FragmentA.onSaveInstanceState aufgerufen. So seltsam ... irre ich mich, wenn ich erwarte, dass ein Fragment, das dem Backstack hinzugefügt wird, nicht neu erstellt werden muss? Folgendes sagen die Dokumente :
Wenn Sie dagegen beim Entfernen eines Fragments addToBackStack () aufrufen, wird das Fragment gestoppt und fortgesetzt, wenn der Benutzer zurück navigiert.
ListView
. Scheint viel zu viel Hoop-Jumping zu sein, um einen Scroll-Listener anzuhängen und eine Instanzvariable zu aktualisieren.