Android Fragment的琐事

ps:感谢J总的鼎力相助

记录一点关于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方法,这样在这里判断是否保留也可以

如果有更好的方法,欢迎提供

==================================================
使用fragment+RadioGroup做底部导航

处理了每次切换fragment都会初始化的问题

如果使用add后再使用replace,返回的时候,前一个fragment会空白

比如在AFragment中使用N个Fragment做首页,这N个Fragment之间的切换都是使用add

在某一个Fragment中添加事件使用跳转到下一个会覆盖AFragment的Fragment

如果这里跳转使用了replace,那么返回的时候,AFragment所展示的内容会空白,同样使用add就可以

反之,如果在AFragment上几个Fragment都是使用replace,那么跳转的时候也要用replace

应该是跟Fragment的生命周期有关,加上处理了不再重复初始化,引起这样的问题
==================================================

待解决问题:


==================================================

其他待续...如有错,欢迎指正


==================================================
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章