Android 架构导航组件:每次调用onCreateView

Android 架构导航组件:每次调用onCreateView,android,androidx,fragment-backstack,android-architecture-navigation,Android,Androidx,Fragment Backstack,Android Architecture Navigation,每次创建片段实例并在按back时重新加载 如何克服这个问题 无法在导航控制器中进行适当的后退是一个巨大的生产力问题。希望这是一个缺少的功能或一个工作的目的。。。IMO这是必须的,必须尽早推出(但是:在可预见的将来,我们不允许定制交易类型(如隐藏/显示等):( 有人有解决办法吗 我的代码是使用导航进行导航 object NavigationHelper : Navigational { override fun moveDownWithPop(view: View,id: Int,popSt

每次创建片段实例并在按back时重新加载

如何克服这个问题

无法在导航控制器中进行适当的后退是一个巨大的生产力问题。希望这是一个缺少的功能或一个工作的目的。。。IMO这是必须的,必须尽早推出(但是:在可预见的将来,我们不允许定制交易类型(如隐藏/显示等):(

有人有解决办法吗

我的代码是使用导航进行导航

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()
}
}

我找到了一些博客

我确实喜欢这样,但我仍在等待谷歌的解决方案

我们做到了,但仍在等待更好的方法

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
}
}
class-ManageEventsFragment:BaseFragment(){
私有变量绑定:FragmentFindEventsBinding?=null
私有变量manageEventViewModel:manageEventViewModel?=null
覆盖创建视图(充气机:布局充气机,容器:ViewGroup?,savedInstanceState:Bundle?):视图{
if(binding==null)
binding=DataBindingUtil.充气(充气器,R.layout.fragment\u find\u事件,容器,false)
变量listingType:字符串?=null
if(参数!=null){
listingType=参数!!.getString(常量.listingType)
/*if(listingType!=null&&listingType.equals(Constant.SEARCHLIST)){
val data=arguments!!.getString(常量.SEARCHEVENTMODEL)
val managetEventDataModel=com.admission.manageevents.utils.utils.getManageEventDataModel(数据)
manageEventViewModel!!.setSearchDataModel(ManageEventDataModel!!)
}*/
}
val sharedViewModel=ViewModelProviders.of(activity!!).get(sharedViewModel::class.java)
sharedViewModel!!.dataToShare.observe(此,观察者{managetEventDataModel->
listingType=Constant.SEARCHLIST
manageEventViewModel!!.setSearchDataModel(ManageEventDataModel!!)
})
if(manageEventViewModel==null){
manageEventViewModel=ViewModelProviders.of(activity!!).get(manageEventViewModel::class.java)
manageEventViewModel!!.setBinder(绑定!!,上下文!!,列表类型)
loadAdvertision(绑定!!.Advertision.imgadvertision,绑定!!.Advertision.tvAdvertision,绑定!!.Advertision.lAdvertision)
}
返回绑定!!.root
}
}

就像Bhavesh所做的那样,在我的例子中,我只有一个列表,在onCreateView中,这一行就足够了:

if (adapter.isEmpty()) {
            viewModel.getShopCats()
}
适配器必须具备以下功能:

fun isEmpty(): Boolean {
        return modelList.isNullOrEmpty()
}

谢谢,它是有效的,但正如你所说,如果谷歌能修复它,我们将不胜感激