android-fragments requireActivity和onActivityCreated之间的区别是什么

9w11ddsr  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(115)

在我的代码中,我不方便在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上浏览了一些最佳实践之后,很多例子都使用requireActivity()方法来加载onCreateView()中的照片:

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()之后使用活动引用和从requireActivity()获得活动引用之间的区别吗?

mxg2im7a

mxg2im7a1#

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

1. activity!!requireActivity()之间的区别

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

2. onActivityCreated()onCreateView()之间的“区别”

ActivityFragment视图都已经创建时,onCreateView()之后调用方法onActivityCreated()
Fragment视图应该仍然被创建时,方法onCreateView()在**onActivityCreated()之前被调用。
在您的场景中,Glide用法的放置位置没有区别,如果Fragment保留其示例,或者ImageViewActivity内部,则会有区别。
顺便说一下,我会将您的Glide用法移到onViewCreated()中,因为onActivityCreated()很快就会被弃用(https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。

ltskdhd1

ltskdhd12#

它们是完全不同的东西,除了词语活动之外,它们没有任何相似之处。
getActivity()(或者在Kotlin的情况下是activity)是访问创建当前片段的Activity的方法。它可以为空,因此您需要检查代码内部的可空性。
requireActivity()返回非空Activity示例以进行分段或引发异常的方法。
如果您**100%**确定在您的片段生命周期中,activity不为null,请使用requireActivity(),因为它不需要在代码中使用!!标记,否则请将其放在try-catch块中以避免 NullPointerException
onActivityCreated()是一个生命周期方法,在创建片段的父Activity时调用该方法。

esyap4oy

esyap4oy3#

接受的答案是好的,但我认为这是一个小错误。这里的更正getActivity()不抛出任何异常。它只返回null。我已经详细讨论了它here
1.唯一的区别是如果Activity为null,requireActivity会抛出IllegalStateException。但是,如果Fragment未附加到Activity,getActivity会返回null。requireActivity()返回异常及其消息。当然,requireActivity()会抛出更显式的异常。

相关问题