在我的代码中,我不方便在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()
获得活动引用之间的区别吗?
3条答案
按热度按时间mxg2im7a1#
我们应该把这个答案分成两部分。
1.
activity!!
和requireActivity()
之间的区别它们都调用
getActivity()
,如果Activity
为空,它们都会抛出异常。唯一的区别是返回的异常类型及其消息。当然,requireActivity()
抛出的异常更显式。2.
onActivityCreated()
和onCreateView()
之间的“区别”当
Activity
和Fragment
视图都已经创建时,在onCreateView()
之后调用方法onActivityCreated()
。当
Fragment
视图应该仍然被创建时,方法onCreateView()
在**onActivityCreated()
之前被调用。在您的场景中,
Glide
用法的放置位置没有区别,如果Fragment
保留其示例,或者ImageView
在Activity
内部,则会有区别。顺便说一下,我会将您的
Glide
用法移到onViewCreated()
中,因为onActivityCreated()
很快就会被弃用(https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。ltskdhd12#
它们是完全不同的东西,除了词语活动之外,它们没有任何相似之处。
getActivity()
(或者在Kotlin的情况下是activity
)是访问创建当前片段的Activity的方法。它可以为空,因此您需要检查代码内部的可空性。requireActivity()
返回非空Activity示例以进行分段或引发异常的方法。如果您**100%**确定在您的片段生命周期中,activity不为null,请使用
requireActivity()
,因为它不需要在代码中使用!!标记,否则请将其放在try-catch块中以避免 NullPointerException。onActivityCreated()
是一个生命周期方法,在创建片段的父Activity时调用该方法。。
esyap4oy3#
接受的答案是好的,但我认为这是一个小错误。这里的更正getActivity()不抛出任何异常。它只返回null。我已经详细讨论了它here。
1.唯一的区别是如果Activity为null,requireActivity会抛出IllegalStateException。但是,如果Fragment未附加到Activity,getActivity会返回null。requireActivity()返回异常及其消息。当然,requireActivity()会抛出更显式的异常。