在这次项目开发中出现不少的问题,下面列举一二。
1 百度地图闪屏
2 同一个activity中的两个百度地图,切换时地图无法刷新。
3 fragment数据保存
项目的整体架构是这样的,app底部有四个导航按钮。这个功能是采用fragment的显示与隐藏的方式,由于其中两个fragment里面都有各自的地图页面。
先说说第一个问题吧,这个情况在网上也出现很多,很多开发者都遇到这个问题,但都没有一个一个解决方案 。首先,说一下是如何出现的。我们采用fragment+viewpager嵌套百度地图,设置viewpager预加载数量为1,时,按下第二个fragment页会出现闪屏的情况。那么把预加载数量设置为2,出现闪屏的情况在选择viewpager第二个页面。这样的现象,确实难以理解。百度地图官方给的解释是系统surefaceView所致,如何解决也无从所知。开始认为是fragment所致。于是换做TabActivity,来实现导航栏,很遗憾。。。。仍然会出现闪屏现象。后来问问大牛,在Mainactivity中添加一句 getWindow().setFormat(PixelFormat.TRANSLUCENT); 即可。当然,viewpaager预加载数量是2。如是1,应该也没问题。
第二个问题:前面锁了,两个Fragment中都是到了地图。在切换的时候,始终是第一次出现的地图页面处于活动状态,第二一个地图页面没有时间响应。因为四个fragment都是依赖于MainActivity,也就是说,两个不同的地图在同一个MainActivity。有人说:考虑到内存中只有一个地图,也许是百度地图这样设计,内存中只会实例化一个地图。于是我打印的两个MapView的内存地址,发现时不同的地址。看起来很奇怪,无法解释啊。于是采用了2种方式来解决这个问题,当然前一种方案是失败的。
第一,viewpager的item中的view是一个布局,于是把布局换作fragment,也就是fragment+viewpager+fragment的方式
第二:采用MainActivity切换导航栏替换fragment的方式来切换fragment。这个方式还真不错,两个地图都能显示各自的内容,也不会出现上述情况。这样一来,新的问题又出现了。每一个fragment的数据需要重新加载一次,这个不用多做解释,因为是重新加载旧的fragment。很多网络数据,已经取下来了,由于我的一次导航栏切换,有需要再次获取网络数据,这个不仅体验不好,而且还非常消耗流量。于是就出现了四三个问题。第三个问题:fragment保存数据。单纯地使用onSaveState方法来保存,那我们也太单纯了。因为这事fragment,不是activity。fragment保存数据处理方式比activity要复杂的多。后来在网上找到一个开源库,叫statedFragment。这个开源库用起来很方便,我们只需要重写onSaveState和onRestoreState两个方法来保存和获取数据。在项目中集成好后,fragment的数据保存问题也就解决了。
如果项目中总是出现这样复杂的问题,估计都快疯了。能找到方法解决,自然是好。