关于在Fragment中getActivity与getApplicationContext等方法返回null的问题

今天在项目里遇到这个问题,在请求接口后返回的时候getactivity一直为null的问题,尝试了各种方法之后依旧不行,最后发现连TextView.setText都空指针了

这时候才认真的去查看原因,发现主要还是自己对activity和fragment的生命周期理解不透彻

这里也算拾人牙慧了,fragment具体生命周期如下

生命周期分析:

  1. fragment被创建的时候
    • onAttach()
    • onCreate()
    • onCreateView()
    • onActivityCreated()
      2.fragment对用户可见的时候
    • onStart()
    • onResume()
    • fragment进入“后台模式”的时候
    • onPause()
    • onStop()
    • fragment被销毁的时候
    • onPause()
    • onStop()
    • onDestroyView()
    • onDestroy()
    • onDetach()
    • 就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。
    • onCreate()
    • onCreateView()
    • onActivityCreated()
    • fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。
    • onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
    • onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
    • onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
    • onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
    • onDetach() —— 当fragment和activity分离的时候,调用这个方法。
如上所示,通常我们在设置fragment之前都会将fragment进行实例化,但是这里的实例化后并不会给我们生成View,所以这个时候我们如果对View进行操作就会出现NollPointerException,同理,如果我们的fragment没有调用onAttached方法的话,fragment也就无法获取到Activity,这也就是我们getActivity出现异常的根本所在。

博主最后去试了下,的确当fragment被show的时候,getActivity是可以获取到的,如果仅仅是add和实例化fragment依旧会返回null

那么如果当我们需要在fragment没有show的时候进行接口请求和视图设置的时候该怎么怎么办?

博主这里推荐的方法是如果在接口请求里面需要用到Context的话,例如Dialog和Progress的时候,不妨用项目里Application的Context代替

而当我们需要设置View的话,最好还是在fragment获取到视图后设置,如果你需要设置的数据是接口数据的话,可以在activity请求在你切换到fragment后进行设置,这样就可以有效避免获取不到activity的尴尬

参考链接


你可能感兴趣的:(android)