【问题标题】:getContext() in Fragment片段中的 getContext()
【发布时间】:2018-07-19 04:42:25
【问题描述】:

我在哪里可以访问Fragment 中的getContext()?我的意思是,它不是 null 并且可以使用(例如,用于创建控件)。是onAttachonCreateView还是onActivityCreated

【问题讨论】:

    标签: android android-fragments android-context


    【解决方案1】:

    所有提到的答案基本上都是正确的。您应该在 onAttach 和 onDetach 之间获得活动的上下文,所以我喜欢将其添加到我的片段中:

    private Context mContext;
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        mContext = null;
    }
    

    然后每当我使用 mContext 时,我都会添加一个检查:

    if(mContext != null) {
       //your code that uses Context
    
    }
    

    更新:

    在支持库 27.1.0 及更高版本中,Google 引入了新方法 requireContext() 和 requireActivity(),它们将返回非 null Context 或 Activty。

    如果在调用方法时 Fragment 当前未附加,它将抛出 IllegalStateException: 所以在 try catch 块中使用。

    【讨论】:

    • 是否存在 mContext 为 null 且片段仍然存在的情况?或者你的意思是当片段分离时有一个长时间运行的操作结束?
    • 是的,如果片段中有一个带有回调的长时间运行的操作,并且您刚刚单击了一个切换片段的按钮,那么您的片段不再附加到您的活动。
    • 同意,这个变种是可能的。
    • 我认为,我们可以使用isAdded() 来判断一个片段是否还存在。但是,如果我们仅依赖上下文,您的变体会更好。
    • 目前requireContext()requireActivity() 是强制性的,而不是getContext()getActivity()。根据 StackOverflow 中的其他主题,您的答案更正确,因为在 onCreate()onCreateView() 中存在 getContext() == null 的情况。
    【解决方案2】:

    getContext()onAttach()onDetach() 之间始终不为空

    【讨论】:

      【解决方案3】:

      onAttachonDetach 之间使用getActivity() 得到附加的Activity,即FragmentContext

      【讨论】:

      • 我想,几乎是一样的。我的意思是 getActivity()getContext() 可能会在片段的生命周期内使用。
      【解决方案4】:

      onCreateView() 中调用getContext() 是非常安全的。如果您查看docs,您会发现从onAttach 开始,您的片段将具有上下文。

      【讨论】:

      • 在 onViewCreated() 中,我的项目中的上下文有时可能为空。所以同样的情况也可能发生在 onCreateView() 中。因此,您的假设是错误的。
      • @oiyio,这很有趣。我读到一些问题,他们真的得到了 context == null。我理解,当片段重新创建时,它可以在活动之前创建。那么,这是否意味着onCreateViewonAttach 之前被调用?
      • 听起来合乎逻辑。 context的原因为null,可能是onAttach之前调用了onCreateView。
      猜你喜欢
      • 2020-07-04
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2021-08-04
      相关资源
      最近更新 更多