- Forum-Beiträge: 1
20.05.2019, 14:38:19 via Website
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
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();
}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.