requireActivity 和 onActivityCreated 有什么区别

What is the difference between requireActivity and onActivityCreated

在我的代码中,我在 onCreateView() 之后加载图片很不方便,因为我不确定 activity 是否可用。因为 Glide 需要一个 activity 上下文,所以我将代码部分放入 onActivityCreated():

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    //Crash unexpected since onActivityCreated should always have activity available
    Glide.with(activity!!)
        .load(viewModel.moment!!.mediaPath)
        .into(binding.momentPhoto);
}

然而,在查看 Github 上的一些最佳实践后,许多示例加载了 onCreateView() 中的照片。他们使用 requireActivity() 方法来做到这一点:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    binding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_photo_editor, container, false)

    Glide.with(requireActivity())
          .load(viewModel.moment!!.mediaPath)
          .into(binding.momentPhoto);

    return binding.root
}

有谁知道在 onActivityCreated() 之后使用 activity 引用和从 requireActivity() 获取 activity 引用有什么区别?

它们是完全不同的东西,除了单词 activity 之外没有任何相似之处。

getActivity()(或 Kotlin 的 activity)是访问创建当前片段的 activity 的方法。它可以为 null,因此您需要检查代码中的可空性。

requireActivity() returns 非空 activity 实例分片或抛出异常的方法。

如果您 100% 确定在片段的生命周期中 activity 不为空,请使用 requireActivity() 因为它不需要!!代码中的符号,否则将其放在 try-catch 块中以避免 NullPointerException.

onActivityCreated() 是一个生命周期方法,在创建片段的父 activity 时调用。

.

我们应该把这个答案分成两部分。

1. activity!!requireActivity()

的区别

它们都调用 getActivity(),如果 Activity 为空,它们都会抛出异常。唯一的区别是返回的异常及其消息的类型。当然,requireActivity() 会抛出一个更明确的异常。

2。 onActivityCreated()onCreateView()

之间的"difference"

方法onActivityCreated()onCreateView()之后ActivityFragment视图都是已经创建。

方法onCreateView()之前被调用onActivityCreated()Fragment视图应该仍然 已创建。

在您的场景中,Glide 用法的放置位置没有区别。如果您的 Fragment 保留其实例,或者如果 ImageViewActivity.

中,那将会有所不同

顺便说一下,我会将您的 Glide 用法移至 onViewCreated(),因为 onActivityCreated() 即将被弃用 (https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。