Ниже приведен мой код для элемента отображения нижней навигации.
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; } });
Теперь моя проблема возникает каждый раз, когда фрагмент воссоздается и не хочет, чтобы фрагмент был воссоздан каждый раз, когда я также пытался добавить addToBackStack (null), но в этом случае при нажатии кнопки «Назад» продолжает выскакивать фрагменты из стека, которые я не хочу.
Есть ли способ отображения фрагментов на нижней навигационной панели, выбранной без повторного создания фрагмента
Попробуй это :
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; } });
Это получит текущий фрагмент в вашем container
и если вы снова нажмете на этот фрагмент, который не будет добавлять фрагмент.
Будьте осторожны при replace
. Даже если вы предоставите фрагмент, который уже существует в памяти, replace
, перезапустите жизненный цикл фрагмента. Чтобы избежать перезапуска, методы объекта транзакции включают в себя add
, show
и hide
, которые могут быть использованы для отображения правильного фрагмента без его перезапуска.
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() }
В библиотеке поддержки v26 вы можете сделать это
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();
SetOnNavigationItemReselectedListener будет лучшим решением для этого