2017-05-08 7 views
0

Ich benutze BottomNavigationView in Android, um eine Anwendung wie Instagram zu erstellen. Ich benutze Fragmente mit den navigationTabs. App habe 5 Tabs initial Ich habe die mittlere Registerkarte als aktive Registerkarte eingestellt und lädt sie sobald die App startet. Wenn ich auf eine andere Registerkarte klicke, wird ein Netzwerkanruf getätigt und Daten werden geladen. Wenn ich nun auf die Zurück-Taste drücke oder auf die letzte Registerkarte klicke (die beim Start geladen wurde), wird das Fragment neu erstellt und der Netzwerkaufruf wird zum Laden der gleichen Daten gemacht. Ich möchte die vorherigen Fragmente mit denselben Daten anzeigen, ohne sie neu erstellen zu müssen.Verhindern, dass das Fragment jedes Mal neu erstellt wird, wenn auf die Schaltfläche "Basisnavigation" geklickt wird

Ich habe versucht,

transaction.add(container,fragment);

aber ohne Erfolg verwenden.

auf der Registerkarte meinen Code klicken

if (item.getItemId() == R.id.nav_OverView && _current != R.id.nav_OverView) { 
     Overview _overView = new Overview(); 
    _fragmentTransaction.hide(_currentFragment); 
    _fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
    _fragmentTransaction.add(R.id.content_base_drawer, _overView); 
    _fragmentTransaction.commit(); 
    _current = R.id.nav_OverView; 
     viewIsAtHome = true; 
    } 

Ich weiß mit entfernen und hinzufügen, indem ersetzen das gleiche ist.

Jede Hilfe wird geschätzt.

+0

Sehen Sie diese [link] (http://stackoverflow.com/questions/14354885/android-fragments-backstack). Oder, wenn dies nicht funktioniert, verwenden Sie eine Singleton-Klasse, um Daten beim ersten Laden zu speichern und danach zu verwenden. – ADM

+0

poste deinen 'setOnNavigationItemSelectedListener' Code, du erstellst wahrscheinlich dein Fragment darin – marmor

+0

@marmor aktualisiert ... check now – Joe

Antwort

0

Make _overview in ein Klassenfeld (statt einer lokalen Variablen), und die Zuhörer Code, dies ändern:

, verwenden auch replace statt hide + add, diese Fragment already added Fehler verhindern.

Ersetzen Sie ein vorhandenes Fragment, das einem Container hinzugefügt wurde. Dies ist im Wesentlichen der gleiche wie der Aufruf von entfernen (Fragmente) für alle derzeit hinzugefügt Fragmente, die mit dem gleichen containerViewId hinzugefügt wurden und dann add (int, Fragment, String) mit den gleichen Argumenten hier gegeben.

Beispiel Siehe:

if (item.getItemId() == R.id.nav_OverView && _current != R.id.nav_OverView) { 
     if (_overView == null) { 
      _overView = new Overview(); 
     } 
    _fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
    _fragmentTransaction.replace(R.id.content_base_drawer, _overView); 
    _fragmentTransaction.commit(); 
    _current = R.id.nav_OverView; 
    viewIsAtHome = true; 
} 
+0

Fragment bereits hinzugefügt: fragmentName .. bekomme diesen Fehler, wenn ich versuche, zum vorherigen Fragment zurückzukehren. Guter Punkt, obwohl ich auf das Klassenfeld hinwies, das habe ich total vermisst. – Joe

+0

yeah, anstatt das Fragment erneut hinzuzufügen, sollten Sie das eine, das es versteckt, entfernen – marmor

+0

wie genau? Bitte machen Sie die Bearbeitung. schätze deine Hilfe. Wie überprüft man, ob das Fragment bereits geladen ist oder das erste Mal ausgeführt wird? Wenn es bereits geladen wird, wird das vorletzte Fragment angezeigt, das ich nicht gefunden habe. Wenn ich 1 2 3 4 5 öffne und dann 2 öffne, indem ich auf 5 verberge, wird es alle 5 4 3 oder nur verstecken Letzter? – Joe

0

Vor der Erstellung die Ansicht können Sie prüfen, ob die Ansicht nicht oder nicht ist, hilft der folgende Code Problem neu zu erstellen Fragment.

View view; 

@Override 

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

if (view == null) 

{ 

     view = inflater.inflate(R.layout.frag_layout, container, false); 
     init(view); 
    } 

    return view; 
} 
Verwandte Themen