【问题标题】:What is different between getContext and getActivity from Fragment in support library?支持库中 Fragment 的 getContext 和 getActivity 有什么不同?
【发布时间】:2015-08-26 12:49:31
【问题描述】:

支持库中的getContext()getActivity()Fragment 有什么不同?

它们总是返回相同的对象吗? (与当前片段相关的活动)

【问题讨论】:

标签: android


【解决方案1】:

在大多数情况下没有区别但是 ...

所以最初Fragments 托管在FragmentsActivity 中,然后得到Context 一个称为getActivity()

刚刚检查了来源,Fragments 现在可以由任何实现FragmentHostCallback 接口的人托管。我认为这在支持库版本 23 中发生了变化。

当使用较新版本的支持库时,当Fragment 不是由Activity 托管时,您可以在调用getActivity()getContext() 时获得不同的对象。

当您调用getActivity() 时,您会得到一个Activity,它也是一个Context。 但是当你调用getContext 时,你会得到一个Context,它可能不是Activity

【讨论】:

  • 你有例子说明非Activity 类将/可以实现FragmentHostCallback
  • @Sree 嵌套片段呢?我在预期 getActivity() 但 getActivity() 为空的情况下遇到了这个问题。我的案例是一个嵌套片段,所以也许这就是其中的一个案例?
  • @MattHorst NestedFragments 不是上下文。嵌套片段的上下文仍然是活动。我想知道是否有任何非 Activity 类也是上下文
  • @Sree 好的,谢谢。我理解这个问题,我想我只是错误地认为这是一个可能的原因。昨晚我在支持课程上看了更多,现在看起来它很简单。我想知道是否还没有任何非 Activity 类是上下文,但是已经创建了 FragmentHostCallback 以便它们可以朝那个方向移动。
  • 在我的整个经历中,我从来没有与Fragment 合作过,它的上下文不是Activity。也想不出这样的案子。
【解决方案2】:

到目前为止,唯一提供的FragmentHostCallback 实现(在操作系统和支持库中)始终为getContext()getActivity() 返回相同的值。

但是,FragmentHostCallback 的其他构造函数建议在未来的实现中,我们可能会得到:

  • 一个空的Activity 和一个非空的Context,它不是Activity。这看起来不太可能,但我们可以想象片段将来可以在活动之外使用,或者完全沙盒化。
  • 非空Activity 和非空ContextActivity 不同的实例。例如,Context 可以是 ContextThemeWrapper

结论:尽可能使用getContext()。当您需要特定于 Activity 的调用时,请使用 getActivity()

【讨论】:

    【解决方案3】:

    Activity 是 Context 的子类。 Activity 也有 Window 元素和对 UI 方法的访问,而 Context 没有。但是,在大多数情况下,如果您只需要 Context,也是一样的。

    【讨论】:

    • Activity 是 Context 的子类。
    • Activity 是 Context* 的子类
    • 但是同一个对象有不同的接口,如果getActivity返回null,getContext也返回null。是真的吗?
    • @cyroxis & @Alberto:是的,抱歉,感谢您的指正。已编辑。 @mlevytskiy:它不应该返回null,但如果返回,是的,因为引用的对象完全相同(活动),但在一种情况下它只是一个向上转换。事实上,在普通的 Fragments 中,你甚至没有 getContext。
    • @JörnBuitink 不,这不是真的。使用新的支持库getContext()getActivity() 可以返回不同的东西,即。一个可能是NULL,另一个不是。这取决于FragmentHostCallback
    【解决方案4】:

    getContext():- 返回视图当前运行的上下文。通常是当前活动的Activity。 getContext() 未在活动中定义。它在 View(或 View 子类)中用于获取对封闭上下文(Activity)的引用。

    getActivity():- 这个方法给出了Activity的上下文。您可以像yourActivity.this 一样使用它。 getActivity() 通常在 Fragment 中使用,以获取它们插入或膨胀的 Activity 的上下文。

    【讨论】:

      【解决方案5】:

      getContext() - 仅返回上下文视图当前正在运行的活动。

      getActivity()- 返回此片段当前关联的活动。

      getActivity() 可以在 Fragment 中用于获取父 Fragment 的Activity

      【讨论】:

        【解决方案6】:

        您可以使用getActivity(),它返回与片段关联的活动。活动是一个上下文(因为活动扩展了上下文)。 getActivity() 如果在相应片段的 onAttach 之前调用,则可以返回 null。上下文向新创建的组件提供有关活动或应用程序的信息。应该为新创建的组件(无论是应用程序上下文还是活动上下文)提供相关上下文。由于 Activity 是 Context 的子类,因此可以使用它来获取该 Activity 的上下文。 getContext() 仅返回上下文视图当前正在运行的活动。

        【讨论】:

          【解决方案7】:

          getContext()

          仅返回当前正在运行的活动的上下文视图。

          getActivity()

          返回此片段当前关联的 Activity。

          【讨论】:

            【解决方案8】:
            /**
                 * Return the {@link Context} this fragment is currently associated with.
                 */
                public Context getContext() {
                    return mHost == null ? null : mHost.getContext();
                }
            
                /**
                 * Return the {@link FragmentActivity} this fragment is currently associated with.
                 * May return {@code null} if the fragment is associated with a {@link Context}
                 * instead.
                 */
                final public FragmentActivity getActivity() {
                    return mHost == null ? null : (FragmentActivity) mHost.getActivity();
                }
            

            从源码中我们可以发现,当一个fragment附加到一个Activity时,getContext返回null。而当片段附加到上下文时,getActivity 返回 null

            【讨论】:

            • 根据此代码块,如果片段附加到活动,getContext 不会返回 null,但如果片段附加到上下文,getActivity 将返回 null
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-05
            • 1970-01-01
            • 1970-01-01
            • 2013-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多