10

Nach meinem Code für untere Navigationsansicht Artikel istFragment auf der unteren Navigationsansicht Artikel neu gewählte

ausgewählt
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
@Override 
public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
    Fragment fragment = null; 
    switch (item.getItemId()) { 
     case R.id.action_one: 
      // Switch to page one 
      fragment = FragmentA.newInstance(); 
      break; 
     case R.id.action_two: 
      // Switch to page two 
      fragment = FragmentB.newInstance(); 
      break; 
     case R.id.action_three: 
      // Switch to page three 
      fragment = FragmentC.newInstance(); 
      break; 
    } 
    getSupportFragmentManager().beginTransaction().replace(R.id.container,fragment,"TAG").commit(); 
    return true; 
} 
}); 

Nun mein Problem jedes Mal Fragment wird neu erstellt wird und nicht wollen, Fragment neu erstellt werden jedes Mal habe ich auch versucht, addToBackStack (null) hinzuzufügen, aber es in diesem Fall auf der Rückseite der Taste gedrückt halten Fragmente vom Stapel knallen, die ich nicht will.

Gibt es eine Möglichkeit, ohne neu zu erstellen Fragment

+0

Um das zu vermeiden, habe ich eine Karte erstellen: 'Map ' und jeder Fragment haben eine statische ID. Ich erstelle alle Fragmente in 'onCreate' der' Activity'. Aber es ist nicht zu empfehlen. Sie können das Fragment im 'Backstack' mit einem eindeutigen Tag wie' Fragment.class.getSimpleName() 'hinzufügen, dann finden Sie es mit' findFragmentByTag' und committen ihn erneut. Achten Sie darauf, jedes 'Fragment' einmal zum' Backstack' hinzuzufügen. –

+0

Hi Raphael, wie ich schon sagte Ich möchte es nicht zum Backstack hinzufügen, da es bei der Back-Implementierung stört – apk

+0

Dafür kann 'onBackPressed() 'überschrieben werden in deiner 'Aktivität'. Kommentar 'super.onBackPressed()' –

Antwort

6

Versuchen Sie, diese ausgewählte Fragmente auf der unteren Navigationsleiste anzuzeigen:

bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
        Fragment fragment = null; 
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container); 
        switch (item.getItemId()) { 
         case R.id.action_one: 
          // Switch to page one 
          if (!(currentFragment instanceof FragmentA)) { 
           fragment = FragmentA.newInstance(); 
          } 
          break; 
         case R.id.action_two: 
          // Switch to page two 
          if (!(currentFragment instanceof FragmentB)) { 
           fragment = FragmentB.newInstance(); 
          } 
          break; 
         case R.id.action_three: 
          // Switch to page three 
          if (!(currentFragment instanceof FragmentC)) { 
           fragment = FragmentC.newInstance(); 
          } 
          break; 
        } 
        getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment, "TAG").commit(); 
        return true; 
       } 
      }); 

, die das aktuelle Fragment in Ihrem container erhalten wird, und wenn Sie wieder auf klicken Dieses Fragment wird das Fragment nicht hinzufügen.

+0

Wie kann ich auf die Startseite umleiten, wenn ich auf den Zurück-Button klicke ... bitte helfen Sie mir Sir –

+0

Sie können die Funktion 'onBackPressed' aufheben Ihre Hauptaktivität. –

+2

In Ihrem Code, wenn das erste FragmentA geladen, nach dem Klicken auf das zweite als zweite Fragment geladen, danach Wenn Benutzer auf FirstFragment klicken, dann wird auch neu erstellt. –

-1

setOnNavigationItemReselectedListener wäre eine bessere Lösung für die

9

Mit v26 Support-Bibliothek Sie diese

FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
    Fragment fragment = mFragmentManager.findFragmentByTag(tag); 
    if (fragment == null) { 
     fragment = new YourFragment(); 
     fragmentTransaction.add(container.getId(), fragment, tag); 
    } else { 
     fragmentTransaction.attach(fragment); 
    } 

    Fragment curFrag = mFragmentManager.getPrimaryNavigationFragment(); 
    if (curFrag != null) { 
     fragmentTransaction.detach(curFrag); 
    } 

    fragmentTransaction.setPrimaryNavigationFragment(fragment); 
    fragmentTransaction.setReorderingAllowed(true); 
    fragmentTransaction.commitNowAllowingStateLoss(); 
+1

Für ein vollständiges Beispiel können Sie sich dieses Git Repo ansehen https://github.com/okaybroda/FragmentStateManager – Viven

+0

Würden Sie sagen, dies ist der beste Weg, um die Navigation zwischen drei Zielen zu handhaben, wenn Sie die Status-/Listenpositionen usw. beibehalten möchten Hin und her bewegen? Gibt es Einschränkungen bei der Verwendung dieser Methode? Mögliche Speicherlecks oder etwas zu beachten? Ich bin noch nicht 100% Sound auf Lifecycle noch – Burkely91

+0

Wäre es besser, dies zu tun oder irgendwie Instanz Zustand wiederherstellen ist, was ich wirklich wissen will, denke ich! – Burkely91

2

Seien Sie vorsichtig bei der Verwendung von replace tun können. Selbst wenn ein Fragment bereitgestellt wird, das bereits im Speicher vorhanden ist, startet replace den Lebenszyklus des Fragments neu. Um einen Neustart zu vermeiden, enthält die Methode des Transaktionsobjekts add, show und hide, die verwendet werden können, um das korrekte Fragment anzuzeigen, ohne es neu zu starten.

private fun switchFragment(index: Int) { 
    val transaction = supportFragmentManager.beginTransaction() 
    val tag = fragments[index].tag 

    // if the fragment has not yet been added to the container, add it first 
    if (supportFragmentManager.findFragmentByTag(tag) == null) { 
     transaction.add(R.id.container, fragments[index], tag) 
    } 

    transaction.hide(fragments[navigationBar.currentTabPosition]) 
    transaction.show(fragments[index]) 
    transaction.commit() 
} 
+1

Sie verwendeten etwas verwirrende Formulierung dort, nur um zu verdeutlichen: Ersetzen startet den Lebenszyklus eines Fragments nicht neu, da es der Benutzeroberfläche hinzugefügt wird - es beendet das Fragment, das momentan angehängt ist, fügt dann das neue Fragment hinzu, von dem wir nur annehmen können, dass es zuvor zerstört wurde wenn es entfernt oder zum ersten Mal hinzugefügt wird. Es wird also sicherlich von ja aus beginnen, aber nicht, weil replace es dazu zwingt. Im Wesentlichen ersetzen = entfernen (oldFrag) dann hinzufügen (newFrag). – Burkely91

+0

Was ist 'currentTabPosition'? 'android.support.design.widget.BottomNavigationView' scheint diese Eigenschaft nicht zu haben. –

1

Verwenden setOnNavigationItemReselectedListener wie folgt aus:

private BottomNavigationView.OnNavigationItemReselectedListener onNavigationItemReselectedListener 
      = new BottomNavigationView.OnNavigationItemReselectedListener() { 

     @Override 
     public void onNavigationItemReselected(@NonNull MenuItem item) { 
      Toast.makeText(MainActivity.this, "Reselected", Toast.LENGTH_SHORT).show(); 
     } 
    }; 

und nennen Sie es mit:

navigation.setOnNavigationItemReselectedListener(onNavigationItemReselectedListener); 
Verwandte Themen