在 Android 片段中,为什么不在 `onCreateView` 上调用超类?

In an Android Fragment, why is a call to superclass not made on `onCreateView`?

通读“Head First Android Development”,我在第 367 页注意到了这个问题。

该代码是一个片段的实现,并且覆盖了几个生命周期方法,即onCreateViewonStart

onStart() 看起来像这样:

@Override
public void onStart() {
  super.onStart();
  ...
}

onCreateView 看起来像这样:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  return inflater.inflate(R.layout.fragment_workout_detail, container, false);
}

请注意,onStart 包括通过 super.onStart() 调用被覆盖的方法,而 onCreateView 不调用其被覆盖的方法。

为什么 onStart 进行 super 调用,而 onCreateView 不进行调用?

同样在此页面上,有粗体文字,阅读:

You should always call up to the superclass when you implement any fragment lifecycle methods.

如果是这样,那为什么onCreateView方法不调用父类呢?

问题页面如下所示。

Why does onStart make the super call, while onCreateView does not?

简短的回答是你的书可能很旧。

如果你查看源代码,you see that onCreateView only does something if you provide a layout resource ID。预计您将自己提供一个视图,因此如果您重写该方法,则调用 super class 没有任何用处。此外,onCreateView 过去甚至不会做那么多,它只会 return null,所以调用它没有任何意义。这可能是您写书时的工作方式。

相比之下,you can see that onStart not only has logic, but actively checks if you've called it (mCalled = true) and throws an exception if you didn't call it

因此对于某些方法,调用 super 是可选的并且不会产生任何影响,而其他方法基本上是必需的(否则您会得到异常)。

该评论是正确的。您应该总是 调用超类生命周期方法。因为他们做事。 onCreateView Fragment如下:

mContentLayoutId 是一个布局 Res id,您可以在片段的构造函数中使用它:

它的作用是膨胀资源布局 mContentLayoutId,您可以将其传递给片段的构造函数和 return 结果,如果未设置 return null。

因为你想膨胀你的布局,你不需要这个。虽然你可以调用它,但它没有效果(除非你将布局资源传递给片段构造函数并想对 return 视图做一些事情,我不推荐因为 onViewCreated 存在。