片段导航与片段容器

时间:2020-08-05 15:12:59

标签: android android-fragments

使用片段导航,当我再次将temp1移到temp2并将temp2移到temp1时,我看到该片段是新生成的。但是当我使用fragmentManager.replace时,它会重用我已经使用的片段。

正在输入代码

    private lateinit var binding : ActivityMainBinding
    private  var currentFragment: Fragment?=null
    private  var homeFragment = HomeFragment()
    private  var temp1Fragment =Temp1Fragment()
    private  var temp2Fragment= Temp2Fragment()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initBottomNavItemClick()
        currentFragment = homeFragment
    }


    private fun initBottomNavItemClick(){
        binding.bottomNavigationView.setOnNavigationItemSelectedListener {
            when(it.itemId){
                R.id.homeFragment->{
                //    findNavController(R.id.navFragment).navigate(R.id.homeNavFragment)
                    currentFragment = homeFragment
                    changeFragment(this,binding.fragmentContainer,currentFragment!!)
                }
                R.id.tempFragment1->{
                   // findNavController(R.id.navFragment).navigate(R.id.temp1NavFragment)
                    currentFragment = temp1Fragment
                    changeFragment(this,binding.fragmentContainer,currentFragment!!)
                }
                R.id.tempFragment2->{
                   // findNavController(R.id.navFragment).navigate(R.id.temp2NavFragment)
                    currentFragment = temp2Fragment
                    changeFragment(this,binding.fragmentContainer,currentFragment!!)
                }
            }

            true
        }
    }

因此,当我使用fragmentManager时,我回来时可以保留recyclerview的位置,但不能保留片段导航。片段导航会生成一个新片段,其位置从0开始。 片段导航是否可以保持以前的状态不会重新生成?

1 个答案:

答案 0 :(得分:0)

我将分两部分回答您的问题。

  • 解决方案
  • 说明

解决方案

每次返回上一个片段时都不要使视图膨胀。将View保存在局部变量中,然后仅对其充气一次。由Ian Lanke

建议
private var savedViewInstance: View? = null

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    return if (savedViewInstance != null) {
        savedViewInstance
    } else {
        savedViewInstance =
                inflater.inflate(R.layout.fragment_professional_details, container, false)
        savedViewInstance
    }
}

说明

让我们了解导航架构下片段的生命周期。

场景:我们正在提取两个片段,HomeFragment和DashboardFragment。这两个片段都属于同一个NavGraph,起始目的地是“首页片段”。

启动应用程序时的片段生命周期-

HomeFragment:onAttach:

HomeFragment:onCreate:

HomeFragment:onCreateView:

HomeFragment:onViewCreated:

HomeFragment:onActivityCreated:

HomeFragment:onStart:

HomeFragment:onResume:

关于导航:首页片段--->仪表板片段

DashboardFragment:onAttach:

DashboardFragment:onCreate:

DashboardFragment:onCreateView:

DashboardFragment:onViewCreated:

DashboardFragment:onActivityCreated:

DashboardFragment:onStart:

DashboardFragment:onResume:

HomeFragment:onPause:

HomeFragment:onStop:

HomeFragment:onDestroyView:

关于导航:仪表板片段--->主页片段

HomeFragment:onAttach:

HomeFragment:onCreate:

HomeFragment:onCreateView:

HomeFragment:onViewCreated:

HomeFragment:onActivityCreated:

HomeFragment:onStart:

HomeFragment:onResume:

DashboardFragment:onPause:

DashboardFragment:onStop:

HomeFragment:onDestroy:

DashboardFragment:onDestroyView:

DashboardFragment:onDestroy:

如果我们要保存初始HomeFragment: onCreateView()上的视图,并在每次下一次调用HomeFragment: onCreateView()时夸大同一视图,则可以恢复旧视图。

如果您注意到HomeFragment: onDestroy()将被调用,但在HomeFragment: onViewCreated()被调用之后。调用HomeFragment:onDestroy()只是破坏HomeFragment的旧实例。

我仍然认为这种处理方式不是最佳做法,但是直到Google提出类似onFragemntRestore()之类的方式。

要真正更新视图,必须先使用ViewModel并观察更改以更改视图。

有关更多信息,请访问this线程。
编码愉快!