Согласно Документам для Android :
replace () по сути аналогична вызову remove (Fragment) для всех
в настоящее время добавлены фрагменты, которые были добавлены с тем же
containerViewId, а затем добавить (int, Fragment, String) с тем же
приводимые здесь аргументы.
Однако мой код говорит иначе.
Мое приложение имеет 1 активность и несколько фрагментов. Он также имеет BottomNavigationView
с 3 вкладками (Опции, Игра, Таблицы лидеров).
Когда инициализируется MainActivity
, в контейнер добавляется 3 фрагмента FrameLayout
MainActivity
. Сразу после добавления скрываются 2 фрагмента, и на экране остается 1 (открывающий фрагмент).
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
val transaction = supportFragmentManager.beginTransaction()
transaction.add(R.id.fragment_layout, firstFragment, "Opening")
transaction.add(R.id.fragment_layout, OptionsFragment(), "Options")
transaction.add(R.id.fragment_layout,LeaderboardsFragment(), "Leaderboards")
transaction.commitNow()
val transaction2 = supportFragmentManager.beginTransaction()
val options: androidx.fragment.app.Fragment = supportFragmentManager.findFragmentByTag("Options")!!
val leaderboards: androidx.fragment.app.Fragment = supportFragmentManager.findFragmentByTag("Leaderboards")!!
transaction2.hide(options)
transaction2.hide(leaderboards)
transaction2.commitNow()
}
С этого момента каждый фрагмент, который не OptionsFragment()
или LeaderboardsFragment()
заменяется на replace()
.
OpeningFragment.kt
transaction?.replace(R.id.fragment_layout, playerDetailsFragment, "Add Player")
transaction?.commit()
gameString = "Add Player"
OptionsFragment()
и LeaderboardsFragment()
отображаются в виде выбора из нижней навигационной панели, которая затем скрывает все остальные фрагменты, кроме выбранного (например, если в нижней навигационной панели выбрано «Опции», то каждый фрагмент скрыт, кроме OptionsFragment())
.
MainActivity.kt
override fun onNavigationItemSelected(item: MenuItem): Boolean {
val fragmentTags = arrayListOf("Opening", "Leaderboards", "Options", "Add Player", "Question", "Location", "Game Over")
val transaction = supportFragmentManager.beginTransaction()
val selectedFragmentTag = when (item.itemId) {
R.id.action_leaderboards -> "Leaderboards"
R.id.action_options -> "Options"
else -> {
gameString
}
}
// Selected Fragment
val selectedFragment: androidx.fragment.app.Fragment? = supportFragmentManager.findFragmentByTag(selectedFragmentTag)
for (fragment_tag in fragmentTags){
// Hide every Fragment that has been added and isn't the selected Fragment
val fragment = supportFragmentManager.findFragmentByTag(fragment_tag)
if (fragment != null && fragment != selectedFragment) {
transaction.hide(fragment)
}
}
transaction.show(selectedFragment!!)
transaction.commit()
return true
}
Этот метод не работает. Однако - если я использую remove()
и add()
вместо replace()
, то он работает нормально:
OpeningFragment.kt
val opening = fragmentManager?.findFragmentByTag("Opening")
transaction?.remove(opening!!)
transaction?.add(R.id.fragment_layout, playerDetailsFragment, "Add Player")
transaction?.commit()
gameString = "Add Player"
Есть идеи, почему это так?