文章目录
FragmentPagerAdapter和FragmentStatepagerAdapter
-
区别:
- FragmentPagerAdapter不用到用时调onDestoryView()和onCreateView()----Fragment没有被销毁
- FragmentStatePagerAdapter不用到用时调onDestoryView()、onDestory()和onCreate()、onCreateView()----Fragment被销毁
-
使用场景:
- 页面少、经常需要调用使用FragmentPagerAdapter能更好提升响应速度
- 数量多、调用次数少、占用内存多使用FragmentStatePagerAdapter能更好管理内存
Activity管理Fragment实例的正确方法
-
实例化Fragment
- 错误:new xxFragment(参数)
- 正确:应该使用Bundle传递参数,这样当Fragment被销毁重新创建的时候Bundle传递的参数会被回复,普通写法不会(因为被销毁重新创建只会走默认构造方法,获取不到值)
如下
public static CommunityFragment newInstance(Long id) { Bundle bundle = new Bundle(); bundle.putLong("type", Id()); CommunityLocalFragment fragment = new CommunityLocalFragment(); fragment.setArguments(bundle); return fragment; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { Bundle bundle = this.getArguments(); if (bundle != null) { userId = bundle.getLong("id"); }
-
使用SparseArray集合巧妙管理Fragment
-
错误:
这么写,当activity发生屏幕旋转或者被回收,Adapter的getItem()方法不会被执行,会导致所拿到的Fragmen和显示的Fragmen不是同一个,造成点击按钮没反应等情况 -
正确:
- SparseArray 一个功能接近map的集合
- 每当调用instantiatiItem(…)时会返回当前fragment保存下来
- 每当调用destroyItem(…)时移除对应fragment
-
这样能保证mFragmets集合里保存的肯定是显示的那个fragment实例
Fragment与Activity之间的通信
-
Activity里调用Fragment方法
- 直接通过Fragment实例进行调用
-
Fragment里调用Activity方法
- 错误:getActivity()再进行强制类型装换获取到activity然后调用方法,因为有时候getActivity =null,并且当fragment换到另一个activity里时就需要进行更改。
- 正确:通过接口回调的方式,fragment对外提供自己的核心事件回调,activity自己选择是否监听(调用接口方法前,记着判空)
其他
fragment里操作View记着先判断该fragment是否被添加过