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