Фрагмент replace () работает иначе, чтобы удалить () + add () - PullRequest
0 голосов
/ 27 апреля 2019

Согласно Документам для 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"

Есть идеи, почему это так?

1 Ответ

1 голос
/ 05 мая 2019

Для меня замена работает именно так, как говорит документация. Он удаляет все фрагменты в указанном контейнере, а затем добавляет новый фрагмент с указанным тегом.

Ваш необязательный код удаляет только один желаемый фрагмент, но не все, поэтому он не идентичен функции замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...