Перезагрузка просмотра объектов при замене фрагментов в Android Kotlin - PullRequest
0 голосов
/ 04 октября 2018

Я хочу переключаться между 5 фрагментами в 1 упражнении, используя объект Bottom Navigation View.Моя проблема: я иду Фрагмент А во Фрагмент Б.затем, когда я возвращаюсь во FragmentA, мои объекты во FragmentA перезагружаются.Я не хочу, чтобы это случилось.Заранее спасибо за помощь.Мои коды активности

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_home -> {
            val homeFragment = HomeFragment()
            openFragment(homeFragment)
            actionBar?.setTitle(R.string.title_home)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_campaign -> {
            val campaignFragment = CampaignFragment()
            openFragment(campaignFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_categories -> {
            val categoriesFragment = CategoriesFragment()
            openFragment(categoriesFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_user_account -> {
            val userAccountFragment = UserAccountFragment()
            openFragment(userAccountFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_cart -> {
          /* val cartFragment = CartFragment.newInstance()
            openFragment(cartFragment)*/
            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

private fun openFragment(fragment: Fragment) {
    supportFragmentManager
            .beginTransaction()
            .setCustomAnimations(R.anim.design_bottom_sheet_slide_in, R.anim.design_bottom_sheet_slide_out)
            .replace(R.id.container, fragment, fragment.javaClass.getSimpleName())
            .addToBackStack(fragment.javaClass.getSimpleName())
            .commit()
}

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Столкнулся с такой же проблемой в моем проекте.Вот мое решение

fun openTab(tabId: String, fragmentClass: String, props: Bundle, manager: FragmentManager) {
    if (manager.fragments.isEmpty() || manager.findFragmentByTag(tabId) == null) {
        val fragment = Fragment.instantiate(activity, fragmentClass, props)
        val transaction = manager.beginTransaction()
        if (manager.backStackEntryCount != 0) {
            manager.fragments.forEach {
                transaction.hide(it)
            }
        }
        transaction.add(contentViewId, fragment, tabId)
        transaction.commit()
    } else {
        val tabFragment = manager.findFragmentByTag(tabId)
        val transaction = manager.beginTransaction()
        manager.fragments.forEach {
            transaction.hide(it)
        }

        tabFragment?.let { transaction.show(it).commitNow() }
    }
}
0 голосов
/ 04 октября 2018

Вместо использования replace - используйте add , а затем вы можете вернуться к предыдущему фрагменту благодаря supportFragmentManager (). PopBackStack () , с которым вы можете справитьсяв onBackPressed ()

0 голосов
/ 04 октября 2018

Вместо создания нового фрагмента при каждом вызове onclick вы можете создать переменную-член фрагмента.

удалить назначения из метода onClick и добавить его в качестве переменной-члена в класс

пример,

class MyActivity ...{
    val homeFragment = HomeFragment()
    val campaignFragment = CampaignFragment()
    val categoriesFragment = CategoriesFragment()
    val userAccountFragment = UserAccountFragment()
    //  val cartFragment = CartFragment.newInstance()

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                openFragment(homeFragment)
                actionBar?.setTitle(R.string.title_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_campaign -> {
                openFragment(campaignFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_categories -> {
                openFragment(categoriesFragment)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_user_account -> {
            openFragment(userAccountFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_cart -> {
              /* openFragment(cartFragment)*/
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }
}

В качестве альтернативы, вы также можете использовать теги фрагментов вместо хранения ссылки на фрагменты

0 голосов
/ 04 октября 2018

Затем используйте viewPager, чтобы удерживать свои фрагменты и перемещаться по нему.

Ваши слушатели щелчка навигации будут запускать viewPager.setCurrentItem(pageIndex)

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