架构导航组件:每次都会调用 onCreateView
Architecture Navigation Component : onCreateView gets called every time
每次创建片段实例并在您按下返回时重新加载。
如何解决这个问题?
无法在导航控制器中拥有适当的后退堆栈是一个巨大的生产力问题。希望它是一个缺失的功能或有意设计的变通方法……在我看来,这是一个必须具备的功能,必须尽快引入(但是:https://issuetracker.google.com/issues/109856764 说 我们不会在可预见的未来允许自定义交易类型(例如 hiding/showing 等)。) :(
Nav-Framework is nice, however, it create fragment's view every time
有人有解决办法吗?
我的代码是使用 Navigation
进行导航
object NavigationHelper : Navigational {
override fun moveDownWithPop(view: View,id: Int,popStackId: Int) {
Navigation.findNavController(view).navigate(id,
null,
NavOptions.Builder()
.setPopUpTo(popStackId,
true).build()
)
}
override fun moveDownWithDataPop(view: View,id: Int,popStackId: Int,bundle : Bundle) {
Navigation.findNavController(view).navigate(id,
bundle,
NavOptions.Builder()
.setPopUpTo(popStackId,
true).build()
)
}
override fun moveUp(view: View) {
Navigation.findNavController(view).navigateUp()
}
override fun moveDown(view: View,id: Int) {
Navigation.findNavController(view).navigate(id)
}
override fun moveDown(view: View,id: Int,args : Bundle) {
Navigation.findNavController(view).navigate(id,args)
}
fun navigateGraph(graphId : Int,context : Context){
var finalHost: NavHostFragment? = NavHostFragment.create(graphId)
(context as MainActivity).supportFragmentManager.beginTransaction()
.replace(com.admision.R.id.content,finalHost!!)
.setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
.commit()
}
}
我找到了一些博客Why I Will Not Use Architecture Navigation Component
我喜欢这个,但我仍在等待 google 的解决方案。
我们做到了,但仍在等待更好的方法
if (manageEventViewModel == null) {
manageEventViewModel = ViewModelProviders.of(activity!!).get(ManageEventViewModel::class.java)
manageEventViewModel!!.setBinder(binding!!,context!!,listingType)
loadAdvertisement(binding!!.advertise.imgAdvertisement,binding!!.advertise.tvAdvertisement,binding!!.advertise.llAdvertisement)
}
完整代码
class ManageEventsFragment : BaseFragment() {
private var binding: FragmentFindEventsBinding? = null
private var manageEventViewModel: ManageEventViewModel? = null
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
if (binding == null)
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_find_events,container,false)
var listingType: String? = null
if (arguments != null) {
listingType = arguments!!.getString(Constant.LISTINGTYPE)
/*if (listingType != null && listingType.equals(Constant.SEARCHLIST)) {
val data = arguments!!.getString(Constant.SEARCHEVENTMODEL)
val managetEventDataModel = com.admision.manageevents.utils.Utils.getManageEventDataModel(data)
manageEventViewModel!!.setSearchDataModel(managetEventDataModel!!)
}*/
}
val sharedViewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
sharedViewModel!!.dataToShare.observe(this,Observer<ManageEventsDataModel> { managetEventDataModel ->
listingType = Constant.SEARCHLIST
manageEventViewModel!!.setSearchDataModel(managetEventDataModel!!)
})
if (manageEventViewModel == null) {
manageEventViewModel = ViewModelProviders.of(activity!!).get(ManageEventViewModel::class.java)
manageEventViewModel!!.setBinder(binding!!,context!!,listingType)
loadAdvertisement(binding!!.advertise.imgAdvertisement,binding!!.advertise.tvAdvertisement,binding!!.advertise.llAdvertisement)
}
return binding!!.root
}
}
就像 Bhavesh 所做的那样,在我的例子中,我只有一个列表,在 onCreateView 中仅此行对我来说就足够了:
if (adapter.isEmpty()) {
viewModel.getShopCats()
}
适配器只需要有这个:
fun isEmpty(): Boolean {
return modelList.isNullOrEmpty()
}
每次创建片段实例并在您按下返回时重新加载。
如何解决这个问题?
无法在导航控制器中拥有适当的后退堆栈是一个巨大的生产力问题。希望它是一个缺失的功能或有意设计的变通方法……在我看来,这是一个必须具备的功能,必须尽快引入(但是:https://issuetracker.google.com/issues/109856764 说 我们不会在可预见的未来允许自定义交易类型(例如 hiding/showing 等)。) :(
Nav-Framework is nice, however, it create fragment's view every time
有人有解决办法吗?
我的代码是使用 Navigation
进行导航object NavigationHelper : Navigational {
override fun moveDownWithPop(view: View,id: Int,popStackId: Int) {
Navigation.findNavController(view).navigate(id,
null,
NavOptions.Builder()
.setPopUpTo(popStackId,
true).build()
)
}
override fun moveDownWithDataPop(view: View,id: Int,popStackId: Int,bundle : Bundle) {
Navigation.findNavController(view).navigate(id,
bundle,
NavOptions.Builder()
.setPopUpTo(popStackId,
true).build()
)
}
override fun moveUp(view: View) {
Navigation.findNavController(view).navigateUp()
}
override fun moveDown(view: View,id: Int) {
Navigation.findNavController(view).navigate(id)
}
override fun moveDown(view: View,id: Int,args : Bundle) {
Navigation.findNavController(view).navigate(id,args)
}
fun navigateGraph(graphId : Int,context : Context){
var finalHost: NavHostFragment? = NavHostFragment.create(graphId)
(context as MainActivity).supportFragmentManager.beginTransaction()
.replace(com.admision.R.id.content,finalHost!!)
.setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
.commit()
}
}
我找到了一些博客Why I Will Not Use Architecture Navigation Component
我喜欢这个,但我仍在等待 google 的解决方案。
我们做到了,但仍在等待更好的方法
if (manageEventViewModel == null) {
manageEventViewModel = ViewModelProviders.of(activity!!).get(ManageEventViewModel::class.java)
manageEventViewModel!!.setBinder(binding!!,context!!,listingType)
loadAdvertisement(binding!!.advertise.imgAdvertisement,binding!!.advertise.tvAdvertisement,binding!!.advertise.llAdvertisement)
}
完整代码
class ManageEventsFragment : BaseFragment() {
private var binding: FragmentFindEventsBinding? = null
private var manageEventViewModel: ManageEventViewModel? = null
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
if (binding == null)
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_find_events,container,false)
var listingType: String? = null
if (arguments != null) {
listingType = arguments!!.getString(Constant.LISTINGTYPE)
/*if (listingType != null && listingType.equals(Constant.SEARCHLIST)) {
val data = arguments!!.getString(Constant.SEARCHEVENTMODEL)
val managetEventDataModel = com.admision.manageevents.utils.Utils.getManageEventDataModel(data)
manageEventViewModel!!.setSearchDataModel(managetEventDataModel!!)
}*/
}
val sharedViewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
sharedViewModel!!.dataToShare.observe(this,Observer<ManageEventsDataModel> { managetEventDataModel ->
listingType = Constant.SEARCHLIST
manageEventViewModel!!.setSearchDataModel(managetEventDataModel!!)
})
if (manageEventViewModel == null) {
manageEventViewModel = ViewModelProviders.of(activity!!).get(ManageEventViewModel::class.java)
manageEventViewModel!!.setBinder(binding!!,context!!,listingType)
loadAdvertisement(binding!!.advertise.imgAdvertisement,binding!!.advertise.tvAdvertisement,binding!!.advertise.llAdvertisement)
}
return binding!!.root
}
}
就像 Bhavesh 所做的那样,在我的例子中,我只有一个列表,在 onCreateView 中仅此行对我来说就足够了:
if (adapter.isEmpty()) {
viewModel.getShopCats()
}
适配器只需要有这个:
fun isEmpty(): Boolean {
return modelList.isNullOrEmpty()
}