Fragmente und das Backstackhandling with OnBackPressed

  • Antworten:2
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 1

20.05.2019, 14:38:19 via Website

Hallo zusammen,

ich bin noch relativ neu in AppEntwicklung und versuche mich momentan an einen Testaufbau für die Menüführung und bekomme seit Tagen ein Problem nicht in den Griff wobei ihr mir vielleicht helfen könntet (thinking)

Also ich besitze eine BottomNavigationView mit 5 anclickbaren Items. Jetzt soll bei erstmaligen clicken des Items eine Instanz des Fragments, falls noch nicht vorhanden, erzeugt werden, in das Layout geladen werden und auf den Backstack gepackt werden.

Jetzt habe ich mich einmal durchgeklickt und 5 Fragmente erstellt. Mit clicken auf dem Backbutton werden auch die Fragmente davor vom backstack abgearbeitet. Funtkioniert soweit.

Sollte ein Fragment bereits erzeugt sein, soll es per TAG gesucht und angezeigt werden ohne eine weitere Instanz zu erzeugen. Das funktioniert auch soweit.
Allerdings bekomme ich beim drücken des Backbuttons die Fehlermeldung: Fragment with ID already added... Wie bekomme ich das Fragment aus dem Backstack nach oben auf den Stack so das die Backbuttonroutine nicht durcheinander kommt ?

So sollte der Backstack und Fragmenthandling aussehen:

|Frag1|
|Frag2|
|Frag3|
|Frag4|
|Frag5|

Click auf Item 2:

|Frag1|
|Frag3|
|Frag4|
|Frag5|
|Frag2|

Code:

 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        FragmentTransaction ft = navigationManager.beginTransaction();
        switch (item.getItemId()) {
            case R.id.navigation_home:
                unsetBehavior();
                fragmentID = "FRAGMENT_HOME_ID";
                if (navigationManager.findFragmentByTag(fragmentID) == null) {
                    createFragment(HomeFragment.newInstance(), fragmentID);
                }
                else showExistingFragment(fragmentID);
                //             fragmentlist.add(1);
                break;
            case R.id.navigation_training:
                unsetBehavior();
                fragmentID = "FRAGMENT_TRAINING_ID";
                if (navigationManager.findFragmentByTag(fragmentID) == null) {
                    createFragment(TrainingFragment.newInstance(), fragmentID);
                    //            fragmentlist.add(2);
                }
                else showExistingFragment(fragmentID);
                break;
            case R.id.navigation_food:
                fragmentID = "FRAGMENT_FOOD_ID";
                if (navigationManager.findFragmentByTag(fragmentID) == null) {
                    createFragment(FoodFragment.newInstance(), fragmentID);
               }
                else showExistingFragment(fragmentID);
       //         fragmentlist.add(3);
                unsetBehavior();
                break;
            case R.id.navigation_articel:
                showFragmentArticel("komp");
     //           fragmentlist.add(4);
                getSupportActionBar().show();
                getSupportActionBar().setShowHideAnimationEnabled(false);
                setBehavior();
                break;
            case R.id.navigation_profil:
                fragmentID = "FRAGMENT_PROFIL_ID";
                if (navigationManager.findFragmentByTag(fragmentID) == null) {
                    createFragment(ProfilFragment.newInstance(), "FRAGMENT_PROFIL_ID");
                }
                else showExistingFragment(fragmentID);
    //           fragmentlist.add(5);
                unsetBehavior();
                break;
        }
       if (item.getItemId() != R.id.navigation_articel){
            getSupportActionBar().hide();
           getSupportActionBar().setShowHideAnimationEnabled(false);
       }
        return true;
    }
};

     public void createFragment(Fragment fragmentContent, String fragmentID) {

    FragmentTransaction ft = navigationManager.beginTransaction();

        Toast.makeText(getApplicationContext(),
                " ausgeführt",
                Toast.LENGTH_SHORT).show();
        ft.replace(R.id.container_fragment, fragmentContent, fragmentID);
      //  ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE );
        ft.addToBackStack(fragmentID);
         ft.commit();

}

public void showExistingFragment(String fragmentID){
    FragmentTransaction ft = navigationManager.beginTransaction();
    Fragment actualFragment = navigationManager.findFragmentByTag(fragmentID);


    ft.replace(R.id.container_fragment, actualFragment, fragmentID);
  //  ft.addToBackStack(fragmentID);

   // ft.show(actualFragment);
    Integer fragmentNumber = navigationManager.getBackStackEntryCount();

    Toast.makeText(getApplicationContext(),
            fragmentNumber.toString(),
            Toast.LENGTH_SHORT).show();
    ft.commit();
}
Diskutiere mit!
  • Forum-Beiträge: 777

20.05.2019, 18:27:54 via Website

Hallo

Wie bekomme ich das Fragment aus dem Backstack nach oben auf den Stack
so das die Backbuttonroutine nicht durcheinander kommt ?

Das wird so nicht gehen das du einfach etwas zwischen aus dem Stack holen kannst. Last in last First Out durch Pop und Push.

Ich mache das anders wenn ich ein neues Fragment aus dem Drewer lade . Entferne ich immer erst
Fragment vom Stack.

Vor dem addToBackStack mache ich getSupportFragmentManager().popBackStack.

Somit wird auch wenn du zb in Fragment 2 bist und dies ein zweite mal im Drawer aufrufst und den zurück Button drückt nicht das Fragment nochmal geladen. Da ja nun das FR zweimal auf dem Stack liegen würde.

Es liegt somit immer nur das letzte Fragment auf dem Stack.
Welches Fragment als erstes auf dem Stack liegt bestimmt du mit deiner ersten TR die du aufrufst und nicht der User über der Drawer. Du musst ja auch bedenken das der User auch durcheinander und auch mehrfach hintereinander das gleiche Fragment aus dem Drawer aufruft kann und somit das gleich FR mehrfach auf dem Stack liegt.

— geändert am 20.05.2019, 18:38:12

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.276

22.05.2019, 08:42:29 via Website

Du könntest dir in dem Zusammenhang auch mal diese Lib angucken

https://github.com/ncapdevi/FragNav

Sie verwaltet pro Item in der BottomNavigation einen getrennten BackStack.
Das kann manchmal ganz hilfreich sein.

Hilfreich?
Diskutiere mit!