【问题标题】:Managing fragments with bottom navigation bar使用底部导航栏管理片段
【发布时间】:2019-11-20 17:55:46
【问题描述】:

我在容器中更改片段时遇到问题。我有三个导航:HomeSpecial offersProfile。在Home 导航中,它可能是fragment1_1fragment2_2,具体取决于具体情况。我的问题是从我的容器中显示片段。我尝试使用findFragmentById,但是当我在Profile 导航并尝试转到Home 时,我的代码不会来自hide() 片段Pofile。我试图查看日志,发现它隐藏了Home 并显示了Home。我的导航代码:

botNav.setOnNavigationItemSelectedListener {
        when(it.itemId){
            R.id.act_home -> {
                if (!it.isChecked){
                    val homeFragment = supportFragmentManager.findFragmentByTag("Home")
                    activeFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
                    activeFragment?.let { hideFragment(it) }
                    showFragment(homeFragment!!)
                }
            }
            R.id.act_profile_info -> {
                if (!it.isChecked) {
                    activeFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
                    activeFragment?.let { hideFragment(it) }
                    showFragment(profileFragment)
                }
            }
            R.id.act_special_offer -> {
                if (!it.isChecked) {
                    activeFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
                    activeFragment?.let { hideFragment(it) }
                    showFragment(specialFragment)

                }
            }
        }
        return@setOnNavigationItemSelectedListener true
    }

所以现在我想了解它为什么会这样,以及如何从FrameLayout 容器中获取显示的片段。 为了为我的导航添加片段,我使用了addFragment() 函数。

【问题讨论】:

  • 添加你现在得到的图片。

标签: android android-fragments


【解决方案1】:

你可以试试这个。经过测试,对我来说工作正常。

每当想要添加和显示以前的现有片段时调用此波纹管方法

 /**
 * Method for add and replace and set fragment if exist in stack
 */
fun setAndReplaceFragment(fragmentWantToAdd: Fragment, tag: String) {
    val manager = supportFragmentManager
    val fragmentFind = manager.findFragmentByTag(tag)
    if (fragmentFind != null) {
        val ft = manager.beginTransaction()
        ft.replace(R.id.mFrmContainer, fragmentFind, tag)
        ft.addToBackStack(tag)
        ft.commit()
    } else {
        val ft = manager.beginTransaction()
        ft.replace(R.id.mFrmContainer, fragmentWantToAdd, tag)
        ft.addToBackStack(tag)
        ft.commit()
    }
}

【讨论】:

  • show()hide()replace()函数有什么区别吗?
  • 顺便说一句,这样的代码每次都会创建片段的实例,我试图避免
  • 不,它没有为每个片段创建一个新实例,它只是将一个片段替换为另一个片段。
  • 我按照您的建议使用了replace() 方法,但您能回答为什么我的代码的行为与我描述的一样吗?
  • 如果你想知道为什么你的代码不能正常工作,那么我需要你的两个方法代码,这很重要。 showFragment() hideFragment()
【解决方案2】:

你可以试试这个:

            //Fragment1 is your new fragment to be shown.
            Fragment fragment=new Fragment1();
            if (fragment != null) {
                FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
                //frams is your backup fragment upon on your navigation/new black 
                fragment(thi will beshown if the Fragment1 is not working)
                ft.replace(R.id.frams, fragment);
                ft.commit();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多