36

Ich habe einen Teil meiner App von Aktivitäten auf Fragmente umgestellt, damit ich die ordentlichen ActionBar-Registerkarten verwenden kann.OnCreateView mehrmals aufgerufen/Mit ActionBar und Fragmenten arbeiten

Nach Abschluss der Umstellung kam es jedoch zu einem Problem: Immer wenn ich zu einer anderen Registerkarte wechsle, wird das Fragment erneut erstellt. OnCreate und onCreateView werden jedes Mal aufgerufen, wenn ich auf einen Tab stoße.

Ich habe 4 Tabletten, jede von denen gemeint ist eines dieses Fragment zu öffnen:

Fragment ShopFragment = new WebActivity(); 
Fragment SearchFragment = new SearchActivity(context); 
Fragment StoreFragment = new StoreLocatorActivity(context, this); 
Fragment BlogsFragment = new BlogsActivity(context, this); 

Hier ist mein Code für den Hörer ist:

class MyTabsListener implements ActionBar.TabListener { 
     public Fragment fragment; 

     public MyTabsListener(Fragment fragment) { 
      this.fragment = fragment; 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      ft.hide(fragment); 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.fragment_container, fragment); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) {   

     } 

    } 

Könnte jemand bitte mir in den richtigen Punkt Richtung?

+0

Weiß jemand wie ich damit umgehen könnte? –

Antwort

43

Wenn Sie FragmentTransaction.replace(...) anrufen, führt Android effektiv eine Sequenz von FragmentTransaction.remove(...) (für alle Fragmente, die diesem Container gerade hinzugefügt werden) und FragmentTransaction.add(...) (für das von Ihnen bereitgestellte Fragment) durch. Durch das Entfernen eines Fragments aus FragmentManager wird das Fragment zerstört und sein Zustand wird nicht mehr verwaltet. Am auffälligsten ist, wenn Sie das Fragment neu hinzufügen, wurden alle Ansichten zurückgesetzt. Hinweis: Da Sie dieselbe Fragment-Instanz erneut verwenden, behält das Fragment den Wert für alle Instanzvariablen.

Eine Lösung für dieses Problem wäre FragmentTransaction.detach(Fragment) und FragmentTransaction.attach(Fragment) beim Umschalten zu verwenden. Dies führt dazu, dass die Fragmentansichten neu erstellt werden (onDestroyView() & onCreateView() wird aufgerufen), aber das Instance-State-Bundle wird zwischen den Aufrufen gespeichert und Ihnen zurückgegeben, sodass der Ansichtszustand beibehalten werden kann. Dies ist der Ansatz von FragmentPagerAdapter, wenn versucht wird, zwischen Fragmenten zu wechseln.

Alternativ können Sie zulassen, dass die Fragmente zerstört werden, aber ihren gespeicherten Zustand für sie unabhängig beibehalten. Dies würde weniger Speicher verbrauchen, auf Kosten einer langsameren Schaltzeit. Methoden der Anmerkung wären FragmentManager.saveFragmentInstanceState(Fragment) und FragmentManager.setInitialSavedState(Fragment.SavedState), in Verbindung mit dem Hinzufügen/Entfernen. Dies ist der Ansatz von FragmentStatePagerAdapter.

Sie können sich die source for FragmentPagerAdapter und die source for FragmentStatePagerAdapter für Implementierungshinweise ansehen.

+0

Dies ist eine Problemumgehung. onCreate und onCreateView werden immer noch aufgerufen, und das Speichern von Status erfordert viel Arbeit. Gibt es nicht eine Möglichkeit, die bereits gemalte Ansicht des Wach-Fragments einfach zu behalten und sie einfach zu ersetzen? Warum neu streichen? –

+1

Es gibt die Option ausblenden. –

+0

Hi, ich benutze ActionBar Tabs und verwende Attach und Detach! Können Sie bitte mit einem Beispielcode erklären, wie ich den Zustand der Instanz speichern kann, wenn ich zu einem anderen Tab wechsle und dann den Status bei der Rückkehr zum Tab behalte! Danke –

7

Es ist die show/hide Option nur so die Fragmente nicht neu gezeichnet werden müssen/neu erstellt und die onCreate() und onCreateView() nicht wieder aufgerufen werden.

+2

Die Lösung finden Sie hier: http://StackOverflow.com/a/11003859/435605 –

Verwandte Themen