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()
Activity
Fragment
该方法onCreateView()
被调用之前 onActivityCreated()
当Fragment
视图应该仍然创建。
在您的场景中,您Glide
使用的位置没有区别。这本来是一个区别,如果你Fragment
保留它的实例或的情况下ImageView
里面的Activity
。
顺便说一下,我会转移你的Glide
使用,onViewCreated()
因为onActivityCreated()
很快就会被弃用(https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。
它们是完全不同的东西,除了单词活动之外没有任何相似之处。
getActivity()
(或activity
在 Kotlin 的情况下)是访问创建当前片段的活动的方法。它可以为空,因此您需要检查代码中的可空性。
requireActivity()
返回非空活动实例以进行分段或引发异常的方法。
如果您100%确定在片段的生命周期中,活动不为空,请使用requireActivity()
它,因为它不需要 !! 代码中的符号,否则将其放在 try-catch 块中以避免NullPointerException。
onActivityCreated()
是一个生命周期方法,在创建片段的父活动时调用。
.
归档时间: |
|
查看次数: |
10592 次 |
最近记录: |