Android - Fragmentstatus speichern / wiederherstellen
Habe ich eine Tätigkeit, in die ich gehen durch mehrere Fragmente. In jedem fragment habe ich mehrere Ansichten (EditText, ListView, Map
etc).
Wie kann ich die speichern die Instanz des fragments, der angezeigt wird, in diesem moment? Ich brauche es um zu arbeiten, wenn die Aktivität ist onPause() --> onResume()
. Auch ich Brauch es um zu arbeiten, wenn ich zurück von einem anderen fragment (pop backstack).
Vom main Activity
ich nenne das erste fragment anschließend aus der das fragment rufe ich die nächste.
Code für meine Tätigkeit:
public class Activity_Main extends FragmentActivity{
public static Fragment_1 fragment_1;
public static Fragment_2 fragment_2;
public static Fragment_3 fragment_3;
public static FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
fragment_1 = new Fragment_1();
fragment_2 = new Fragment_2();
fragment_3 = new Fragment_3();
fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction_1 = fragmentManager.beginTransaction();
transaction_1.replace(R.id.content_frame, fragment_1);
transaction_1.commit();
}}
Dann ist hier der code für eine meiner Fragmente:
public class Fragment_1 extends Fragment {
private EditText title;
private Button go_next;
@Override
public View onCreateView(final LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_1,
container, false);
title = (EditText) rootView.findViewById(R.id.title);
go_next = (Button) rootView.findViewById(R.id.go_next);
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction transaction_2 = Activity_Main.fragmentManager
.beginTransaction();
transaction_2.replace(R.id.content_frame,
Activity_Main.fragment_2);
transaction_2.addToBackStack(null);
transaction_2.commit();
});
}}
Ich suchte eine Menge Informationen, aber nichts klar. Kann jemand eine klare Lösung und ein Beispiel, bitte ?
InformationsquelleAutor der Frage Stanete | 2014-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ein fragment bewegt wird, um den backstack, es ist nicht zerstört. Die Instanz-Variablen bleiben dort. So ist dies der Ort zum speichern Ihrer Daten. In
onActivityCreated
überprüfen Sie die folgenden Bedingungen:Edit: Hier ein Beispiel
InformationsquelleAutor der Antwort Kirill Rakhman
Android-fragment hat einige Vorteile und einige Nachteile.
Die meisten Nachteil des fragments ist, dass, wenn Sie wollen, ein fragment zu verwenden, die Sie erstellen, die es lieben.
Wenn Sie es verwenden,
onCreateView
des fragments heißt für jede Zeit. Wenn Sie möchten, um Status der Komponenten im fragment, müssen Sie speichern Sie die fragment-Zustand und yout laden muss, Ihren Status in die nächste gezeigt.Diese machen fragment Blick ein bisschen langsam und seltsam.
Ich eine Lösung gefunden habe und benutzt habe ich diese Lösung: "Alles ist Super. Jeder Körper kann versuchen".
Beim ersten mal
onCreateView
ausgeführt wird, erstellen Sie anzeigen, wie eine Globale variable. Wenn der zweite Aufruf dieses fragmentonCreateView
aufgerufen wird, können Sie wieder zurück zu dieser globalen Sicht. Die fragment-Komponente Zustand gehalten werden.InformationsquelleAutor der Antwort nebyan
Versuchen Sie dies :
Hoffe, das wird helfen.
Auch Sie können schreiben Sie diese Aktivität tag in menifest Datei :
Glück !!!
InformationsquelleAutor der Antwort Sar
Als hier angegeben: Warum verwenden Fragment#setRetainInstance(boolean)?
können Sie auch Fragmente Methode
setRetainInstance(true)
wie diese:InformationsquelleAutor der Antwort Richard R
Speichern, um die Fragment-Zustand, die Sie implementieren müssen
onSaveInstanceState()
:"Auch wie eine Tätigkeit, die können Sie behalten den Status eines fragments mit einem Bündel, im Falle der Aktivität Prozess getötet wird und Sie Sie wiederherstellen müssen die fragment-Zustand, wenn die activity neu erstellt wird. Sie speichern den Zustand, während das fragment
onSaveInstanceState()
Rückruf, und stellen Sie Sie entweder währendonCreate()
,onCreateView()
oderonActivityCreated()
. Für mehr Informationen über den Status speichern, finden Sie unter Aktivitäten-Dokument."http://developer.android.com/guide/components/fragments.html#Lifecycle
InformationsquelleAutor der Antwort Raanan
Ich bin mir nicht ganz sicher, ob diese Frage noch stört Sie, da hat es schon mehrere Monate. Aber ich möchte zu teilen, wie ich das Problem gelöst.
Hier ist der Quellcode:
Und hier ist die MainActivity:
Den
parentView
ist der Knackpunkt.Normalerweise, wenn
onCreateView
wir benutzen Sie einfach zurückrootView
. Aber jetzt, füge ich rootView zuparentView
, und dann zurückparentView
. Um zu verhindern, dass "Das angegebene Kind bereits einen Elternteil. Rufen SieremoveView()
auf der ..." Fehler, die wir benötigen, rufen SieparentView.removeView(rootView)
oder die Methode, die ich geliefert wird, ist nutzlos.Ich möchte auch zu teilen, wie ich es gefunden. Erstens, ich habe ein boolescher Wert, der angibt, ob die Instanz existiert. Wenn die Instanz existiert, die
rootView
wird nicht aufgeblasen werden wieder. Aber dann, logcat gab das Kind hat bereits eine übergeordnete Sache, so entschied ich mich für den anderen Elternteil als intermediate Übergeordneten Ansicht. Das ist, wie es funktioniert.Hoffe, es ist hilfreich für Sie.
InformationsquelleAutor der Antwort butch
Können Sie aktuelle Fragment aus fragmentManager. Und wenn es nicht von Ihnen im fragment-manager können Sie erstellen
Fragment_1
du kannst auch
setRetainInstance
zu wahren, was es tun wird es ignorierenonDestroy()
Methode im fragment und Ihre Anwendung auf Boden zurück und os töten Ihre Anwendung mehr Speicher zuzuweisen, müssen Sie Sie speichern alle Daten, die Sie brauchen, inonSaveInstanceState
bundleInformationsquelleAutor der Antwort Constantin Cerberus