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()
之后Activity
和Fragment
视图都是已经创建。
方法onCreateView()
在之前被调用onActivityCreated()
当Fragment
视图应该仍然 已创建。
在您的场景中,Glide
用法的放置位置没有区别。如果您的 Fragment
保留其实例,或者如果 ImageView
在 Activity
.
中,那将会有所不同
顺便说一下,我会将您的 Glide
用法移至 onViewCreated()
,因为 onActivityCreated()
即将被弃用 (https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。
在我的代码中,我在 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()
方法onActivityCreated()
在onCreateView()
之后Activity
和Fragment
视图都是已经创建。
方法onCreateView()
在之前被调用onActivityCreated()
当Fragment
视图应该仍然 已创建。
在您的场景中,Glide
用法的放置位置没有区别。如果您的 Fragment
保留其实例,或者如果 ImageView
在 Activity
.
顺便说一下,我会将您的 Glide
用法移至 onViewCreated()
,因为 onActivityCreated()
即将被弃用 (https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。