requireActivity 和 onActivityCreated 有什么区别

chr*_*tel 12 android android-fragments

在我的代码中,我在 onCreateView() 之后加载图片很不方便,因为我不确定活动是否可用。因为 Glide 需要一个活动上下文,所以我将代码部分放入 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);
    }
Run Code Online (Sandbox Code Playgroud)

然而,在浏览了 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
    }
Run Code Online (Sandbox Code Playgroud)

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

Gio*_*oli 22

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

1.之间的差异activity!!requireActivity()

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

2.“差”之间onActivityCreated()onCreateView()

当和视图都已经创建onActivityCreated()调用该方法。 onCreateView()ActivityFragment

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

在您的场景中,您Glide使用的位置没有区别。这本来是一个区别,如果你Fragment保留它的实例或的情况下ImageView里面的Activity

顺便说一下,我会转移你的Glide使用,onViewCreated()因为onActivityCreated()很快就会被弃用(https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。


Arr*_*row 7

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

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

requireActivity() 返回非空活动实例以进行分段或引发异常的方法。

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

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

.