[转]Android Fragment的琐事
[转自]http://blog.csdn.net/lidhsr/article/details/7765779
记录一点关于Fragment的琐事,給自己查阅
==================================================
在3.0以下的api里使用Fragment要导入jar包,包在D:\android-sdk\extras\android\support\v4这位置
在eclipse要建立一个libs文件夹,将jar包放入再Add to Build Path,不然启动会提示Class Not Found
==================================================
Fragement有一个堆栈是交给activity管理,用户模拟后退时使用getFragmentManager().popBackStack();可以返回到堆栈的最上层
popBackStack(String , int) 和popBackStack(int , int) 具体使用方法待研究,还未使用
==================================================
Fragment替换和添加使用
- // id是要放置的layout,fragment是要显示的fragment
- getFragmentManager().beginTransaction().replace(id, fragment).addToBackStack(null).commit();
添加是使用add,replace是替换
addToBackStack是添加到堆栈中,可以模拟后退返回前一个Fragment
不调用这个方法,返回的时候不会返回前一个fragment
每个事务都要调用commit来提交
每个事务要使用独立的FragmentTransaction(没有经过严谨的测试)
==================================================
Fragment的生命周期
每次进来都会经过onCreateView这个返回一个view
如果返回的view里的数据是动态的,那么下次返回的时候将丢失这些数据
需要对数据持久化
如果有数据源,如集合等,可以将数据源的初始化放在Fragment 的onCreate时候
如果是对象,可以保存这个对象,方法很多,onStop,或者获取对象的时候
==================================================
如果在2个Fragment之间互相replace并且addToBackStack,那么返回的时候会多个返回
这个问题可以利用Fragment本身的堆栈管理处理(具体方法没想到,只有大概思路,待鉴定)
还可以对Fragment进行标识,replace之前判断此标识
==================================================
多次replace同一个fragment会让页面空白,而且再次返回也无法刷新数据
要避免多次replace同一个fragment的问题,这样的问题还没去研究是为什么,待解。
怀疑自己哪里操作失误,或者代码逻辑上有误,待鉴定。
==================================================
当两个Fragment互相replace而都没用调用addToBackStack方法的时候
每次回到之前一个Fragment的时候,所有数据都将重新加载,Fragment的生命周期重新走一遍
需要用到上面提到的对数据进行持久化,这个时候不能在Fragment里进行持久化的操作
==================================================
遇到最蛋疼的问题了,UI都用Fragment实现,但现在一个需求,在Fragment中嵌套一个mapView
只是局部一块map,用mapView需要继承MapActivity,而使用Fragment又必须继承FragmentActivity
在网上搜了,找到网友大湿的解决之法,但不适用。
网上的方式还是重新启动了一个MapActivity,而不是在Fragment的局部嵌套了一小块map
如果有人知道解决之法,还请告知,不甚感激。
自己想到了其他的解决之法,根据自己的需求制定了几种应对方法,还是挺好的,个人认为比原来嵌套mapView好
==================================================
直接点击返回按钮与调用popBackStack产生的效果有些不一样
如果Fragment背景透明的,那么调用popBackStack返回的时候,会看到前一页面的内容。
==================================================
如果在Fragment中使用内部类,在内部类中使用Toast或者Dialog时,使用getActivity()有些情况下会取到空
解决办法,使用handler或者在application中定义context
==================================================
很多时候getActivity获取到的是null,原因未知,J总说是fragment的bug,我信了。
解决方法:給Fragment构造传参
==================================================
有时候调用replace时,而不想调用addToBackStack
就是从BFragment replace 到CFramgent而不想保留BFragment,
从C返回时,有的情况是直接返回到A,有的情况是返回B
我的处理方法是在B到C的时候,判断B是否要保留,如果不保留,在replase之前调用popBackStack
还可以在返回的时候处理,是否保留
每次返回都会重新调用onCreateView方法,这样在这里判断是否保留也可以
如果有更好的方法,欢迎提供
==================================================