2014-08-31 9 views
10

Ich baue eine Navigationsschublade wie von der Google-Dokumentation entworfen, aber ich habe ein Problem, wo das Fragment nicht ersetzt wird. http://developer.android.com/training/implementing-navigation/nav-drawer.htmlFragment Transaktion laden leere Ansicht, aber Fragment wird nach rotierendem Gerät angezeigt

Wenn die App zum ersten Mal geladen wird, wird das Standardfragment geladen. Wenn Sie auf ein anderes Element in der Liste der Fächer klicken, wird eine leere Ansicht angezeigt. Beim Laden des Geräts wird jedoch das ausgewählte Fragment geladen.

+1

Ich habe das gleiche Problem. Es ist nicht üblich. Es passiert 1 in 20 Versuchen. onActivityCreated erstellt, die Ansicht kann leer sein ODER ein Teil der Ansicht kann leer sein ... Ich füge statt ersetzen. – apmartin1991

+0

@ apmartin1991 können Sie hier Ihre Code-Snippets bereitstellen (zum Beispiel als gist.github.com) - es wäre einfacher, die Ursache zu verstehen? (Zum Beispiel wird .attach() im ursprünglichen Post aufgerufen, sollte dies aber nicht tun, und es ist beispielsweise nicht nötig, 'executePendingTransactions()' aufzurufen, aber wir wissen nichts über Ihr Problem. –

+0

Konstantin Loginov - Hier ist meine Frage über die gleiche Sache http://stackoverflow.com/questions/34742360/fragment-transaction-loads-a-blank-view – apmartin1991

Antwort

5

Für Navigationsmenü Fragment Transaktionen verwende ich den folgenden Ansatz, auf diese Weise wird das Fragment hinzugefügt und oben platziert.

String name = "myFragment"; 
getSupportFragmentManager() 
.beginTransaction() 
.replace(R.id.content_frame, fragment, name) 
.commit(); 

Suchen Sie die Funktion attach(). Es folgt ein anderer Fragmentlebenszyklus. Stellen Sie außerdem sicher, dass das Framelayout Ihrer Layoutdateien sichtbar ist.

0

Ändern Sie den Code wie folgt:

if(fragment != null) { 
     // attach added to handle viewpager fragments 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.content_frame, fragment); 
     trans.addToBackStack(null); 
     trans.commit(); 
    } else { 
     Log.d("Drawer Activity","Error in creating Fragment"); 
    } 

Wenn die Lösung nicht für Sie arbeiten, teilen Sie den XML-Code zusammen mit Ihrem Fragment-Code.

+1

Ist es nicht nur die Kopie-Paste @Veedkas Antwort? –

0

Nach dem Hinzufügen von Fragment wird es zum Aktivitätsstatus hinzugefügt und seine Ansicht wird der definierten Containeransicht hinzugefügt. Wenn Sie jedoch nichts hinzufügen, wird angezeigt, wenn das Fragment nicht bereits zur Benutzeroberfläche hinzugefügt wurde. Es verbindet einfach mit dem Fragmentmanager. Wenn jedoch die Ansicht bereits zu einem Container in UI hinzugefügt und danach getrennt wurde, wird durch Anhängen in seinem Container wieder angezeigt. Schließlich können Sie anhängen und trennen, wenn Sie Fragment vorübergehend zerstören möchten und seine Ansicht auf Zukunft anzeigen und erstellen, ohne seinen Zustand innerhalb Aktivität zu verlieren.

https://stackoverflow.com/a/18979024/3329488

0

Meine Lösung ist alles, das Fragment mit einzigartigem Tag auf Fragment Ersatz zu markieren. Stellen Sie sicher, dass Sie dem Standardfragment bei der Erstellung auch ein eindeutiges Tag zuweisen. Ein effizienterer Weg besteht darin, das Fragment zu identifizieren, bevor Sie dasselbe erneut erstellen.

public void selectNavActivty(int position){ 
// TODO Changing between the different screens selection 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragment = fragmentManager.findFragmentById(R.id.content_frame); 
    String fragmentTag = null; 
    switch (position) { 
     case 0: 
      fragmentTag = "case0Tag"; // please change to better tag name 
      break; 
     case 1: 
      fragmentTag = "case1Tag"; // please change to better tag name 
      break; 
     default: 
      Log.d("Drawer Activity","Error in creating Fragment"); 
      return; 
    } 
    if (fragmentTag != null && !fragment.getTag().equals(fragmentTag)) 
    fragmentManager.beginTransaction().replace(R.id.content_fragment, fragment, tag).commit(); 
} 
Verwandte Themen