getActivity() 在片段上返回 null?

Posted

技术标签:

【中文标题】getActivity() 在片段上返回 null?【英文标题】:getActivity() returns null on fragment? 【发布时间】:2017-05-05 10:50:36 【问题描述】:

我有MainActivity()FirstFragment()

我正在从MainActivity() 调用 FirstFragment 中的一个函数。

问题是,那个时候 getActivity() 返回 null ?

【问题讨论】:

请出示您的代码。 提供一些代码 发布你是如何在活动中加载片段的? 我想你问的也一样,***.com/questions/10903077/… 你应该对 Fragment 生命周期感兴趣。在某些状态下,getActivity 可以返回 null。 【参考方案1】:

片段开始时执行此操作

public void onViewCreated(View view, Bundle savedInstanceState) 
    mcontext=getContext();

如果您需要,mcontext 很容易被转换为活动。

android API 级别 23 起,onAttach(Activity activity) 已被弃用。您需要使用 onAttach(Context context)。 http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity) 所以如果你想使用 onattach 你需要做

@Override
public void onAttach(Context context) 
    super.onAttach(context);
    Activity a;
    if (context instanceof Activity)
         a=(Activity) context;
    
 

不要做

  if(getActivity()==null)

当您将应用程序移至后台并返回时,get Activity 将返回 null。 如果你使用它,它有时会忽略这部分代码,这会产生你不明白它们来自哪里的错误。

【讨论】:

【参考方案2】:

请使用来自onAttach()Activity 引用。我认为这是使用 Fragment 中的Activity 实例的最佳实践

 public class FirstFragment extends Fragment 
 private Activity mActivity;
     @Override
        public void onAttach(Context context) 
            super.onAttach(context);
            mActivity = (Activity) context;//use this one .. this is MainActivity instance u can use this as MainActivity mMainActivity = (MainActivity)mActivity;
        
  

【讨论】:

从我在其他地方读到的内容来看,这只是一种创可贴式的修复。因为持有活动引用可能会导致整个活动泄漏。理想的解决方案是在活动对象引用为空时不对它执行任何操作。【参考方案3】:
// declare a variable activity in your fragment
private Activity activity;

@Override
public void onAttach(Context context) 
    super.onAttach(context);

    if (context instanceof Activity) 
        this.activity = (Activity) context;
    



@Override
public void onDetach() 
    super.onDetach();
    this.activity = null;



private void initToolbar() 

    // then use the var in any function
    if (activity == null) 
        return;
    


【讨论】:

【参考方案4】:

而不是使用 Activity 引用。您可以创建 Context 类的引用。

private Context context;

@Override
public void onAttach(Context context) 
    super.onAttach(context);
    if (context instanceof Activity) //Name of your activity
        this.context = (Activity) context;
    

【讨论】:

【参考方案5】:

我觉得你应该通过context这样试试

if(isNetworkAvailable(getActivity().getContext())) 

    System.out.println("Internet is On.");
 

【讨论】:

【参考方案6】:
private Context mContext;

@Override
public void onAttach(Context context) 
    super.onAttach(context);
mContext = context;

然后在你想在'MainActivity'中调用函数的地方是这样的:

((MainActivity)mContext).theFunctionYouWanToCall();

或者如果片段可能属于多个活动,则首先检查:

if(MainActivity instanceOf mContext)
  ((MainActivity)mContext).theFunctionYouWanToCall();

希望对您有所帮助!

【讨论】:

以上是关于getActivity() 在片段上返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

Android getActivity() 总是在片段内返回 null

在片段中调用 getActivity() 以使其不返回 null 的最佳做法是啥? [复制]

getActivity() 在片段的 AlertDialog 中为 null

Fragment 中的计划任务将 getActivity 返回为 null

Android 片段 getActivity() = null

view、adapter、getActivity()、infragment 都是 null