【Android】fragment的getActivity为空

Activity, ViewPager里面三个Fragment,A、B、C;C进行操作之后,B报错getActivity为空,导致ListViewAdapter内getSystemService存在空指针,即getActivity为空。new Fragment()在Activity的onCreate()进行。

原因

Activity被系统回收,但fragment的生命周期不会随着Activity被回收,导致出现null的情况

  • Activity被销毁,用户重新返回时,onCreate会被调用,则三个Fragment就会被重新创建,装入到list中
    【Android】fragment的getActivity为空_第1张图片
  • 展示Fragment时,Adapter先通过Manager.findByTag()获取,若为空,再从List中获取。
  • 当界面被回收,系统自动恢复界面状态(包括之前的Fragment)。Adapter显示Fragment1,通过ByTag获取Fragment,发现已经有实例(旧Fragment),不会去调用获取新的Fragment(在onCreate中创建的)。直接显示旧的Fragment,但由于之前的Activity已经被销毁,所以getActivity为空。

解决

1、在Adapter的getItem里面创建Fragment,根据position创建对应的。

  • 要获取Fragment的引用,可通过findByTag获取。Tag组成为viewId和Fragment位置,如下图
    【Android】fragment的getActivity为空_第2张图片

2、在Fragment的生命周期,onAttach中保存对Activity的引用。

你可能感兴趣的:(android)