【问题标题】:Architecture Navigation Component : onCreateView gets called every time架构导航组件:每次都会调用 onCreateView
【发布时间】:2019-02-26 06:27:55
【问题描述】:

每次创建片段实例并在您按下返回时重新加载。

如何解决这个问题?

无法在导航控制器中拥有适当的后台堆栈是一个巨大的生产力问题。希望这是一个缺失的功能或故意制作的解决方法...... IMO 这是一个必须具备的,并且必须尽早引入(但是:https://issuetracker.google.com/issues/109856764我们不会允许自定义可预见的未来的交易类型(例如隐藏/显示等)。):(

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

【问题讨论】:

    标签: android androidx fragment-backstack android-architecture-navigation


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,它有效,但正如你所说,如果谷歌修复它,我们将不胜感激
    【解决方案2】:

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

    if (adapter.isEmpty()) {
                viewModel.getShopCats()
    }
    

    适配器只需要有这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多