【问题标题】:What is the difference between requireActivity and onActivityCreatedrequireActivity 和 onActivityCreated 有什么区别
【发布时间】:2020-04-05 16:13:38
【问题描述】:

在我的代码中,我在 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);
    }

但是,在查看了 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() 之后使用活动引用和从 requireActivity() 获取活动引用有什么区别吗?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

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

    1. activity!!requireActivity()的区别

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

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

    ActivityFragment 视图已经创建时 onCreateView() 之后调用方法onActivityCreated()

    Fragment 视图应该仍然创建时, onActivityCreated() 调用方法onCreateView()

    在您的场景中,您将 Glide 的用法放在哪里没有区别。如果您的Fragment 保留它的实例,或者ImageViewActivity 内部,那将会有所不同。

    顺便说一句,我会将您的 Glide 用法移至 onViewCreated(),因为 onActivityCreated() 即将被弃用 (https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha02)。

    【讨论】:

    • 非常感谢,这澄清了一切! :)
    • @ChristopherDottelis 没问题!
    • onCreateView() 绝对可以在没有活动的情况下运行(活动 == null)。在调用 onCreateView() 时假设您有活动是不安全的。它过去曾咬过我个人。
    【解决方案2】:

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

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

    requireActivity()返回非空活动实例进行分片或抛出异常的方法。

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

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

    .

    【讨论】:

    • 当片段与活动分离并触发一些非UI回调时,您将获得活动空
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多