Android 父片段';s onCreateView在子片段onCreateView之后调用

Android 父片段';s onCreateView在子片段onCreateView之后调用,android,fragment,parent-child,fragment-oncreateview,Android,Fragment,Parent Child,Fragment Oncreateview,我有一个ParentFragment和一个扩展自它的ChildFragment。我在这两个片段的onCreateView方法中放置了一个日志。但是ParentFragment的onCreateView被最后调用 然而,活动之间相同的父子关系正在产生预期的结果。首先调用父活动onCreate,然后调用子活动的onCreate ParentFragment abstract class ParentFragment<T: ViewDataBinding>: Fragment(){

我有一个
ParentFragment
和一个扩展自它的
ChildFragment
。我在这两个片段的
onCreateView
方法中放置了一个日志。但是
ParentFragment
onCreateView
被最后调用

然而,活动之间相同的父子关系正在产生预期的结果。首先调用父活动
onCreate
,然后调用子活动的
onCreate

ParentFragment

abstract class ParentFragment<T: ViewDataBinding>: Fragment(){

    @LayoutRes
    abstract fun getLayoutResId(): Int

    protected lateinit var binding: T


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Log.d("-----------", "onCreateView ParentFragment")
        return DataBindingUtil.inflate<T>(inflater, getLayoutResId(), container, false).apply { binding = this }.root
    }

片段的结果:

2019-12-10 10:54:28.054 32450-32450/blabla.yeahyeah D/-----------: onCreateView ChildFragment
2019-12-10 10:54:28.054 32450-32450/blabla.yeahyeah D/-----------: onCreateView ParentFragment
活动结果:

2019-12-10 10:54:27.796 32450-32450/blabla.yeahyeah D/-----------: onCreate ParentActivity
2019-12-10 10:54:27.931 32450-32450/blabla.yeahyeah D/-----------: onCreate ChildActivity
你能帮个忙吗?我是否遗漏了什么,或者这是一种预期的行为

我重写
onCreateView
的原因是,我试图将我的
viewModel
连接到
ChildFragment
中的
binding
,如下所示:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.d("-----------", "onCreateView ChildFragment")

        val viewModel = getViewModel()
        binding.viewModel = viewModel //CRASH HAPPENING HERE. THIS VARIABLE IS NOT INITIALIZED
        binding.lifecycleOwner = this

        return binding.root
    }


目前,由于从
ChildFragment
访问
binding
变量时未初始化该变量,因此我遇到了崩溃。由于此变量需要在
ParentFragment
中初始化,并且在
ChildFragment
之后调用了
ParentFragment
,因此据我所知,我正在崩溃

为什么要重写子片段中的
onCreateView()
?您已经在父级的
onCreateView()
@jeelvankhee中进行了数据绑定。他解释了我为什么要这样做。请再次检查该问题。请在
onViewCreated()
方法中尝试初始化,它是
onCreateView()
之后的后续调用,在该方法中,绑定对象不会为空。@jeelvankhee是的,这很有帮助。谢谢我怎样才能优化我的代码,使我不需要在每个子片段中编写这个样板代码呢?我觉得你的结构非常简单。只要确保所有片段的公共代码都依赖于父片段,而不是所有子片段。让我知道还有什么样的样板代码!
override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        Log.d("-----------", "onCreateView ChildFragment")

        val viewModel = getViewModel()
        binding.viewModel = viewModel //CRASH HAPPENING HERE. THIS VARIABLE IS NOT INITIALIZED
        binding.lifecycleOwner = this

        return binding.root
    }