使用片段导航,当我再次将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开始。 片段导航是否可以保持以前的状态不会重新生成?
答案 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线程。
编码愉快!