用Fragment的Hide()与Show()来代替Fragment的Replace()吧!
本博客由博主原创,未经允许,不得转载
fragment简介
Fragment说它是一种轻量级的Activity一点也不为过,安卓3.0以后,它迅速崛起,简易的操作与良好的可维护性很快受到了广大安卓爱好者的喜爱,笔者对于Fragment也有过一定时间的研究,最近开发的一些app也是基于Fragment搭建的整体框架。
Fragment的替换
笔者在决定写博客之前,上网查了一些有关Fragment切换的一些资料,大体对于网上针对于这个技术点的博客来说,大多说的还不够清晰,恰巧最近一个做平板开发的朋友问到这个问题,我整理了一下,希望以下资料可以对安卓学习的朋友有所帮助。
我们都知道,安卓在替换Fragment的时候,实际上做了两件事情:
1.将原有的Fragment移除。
getFragmentManager().beginTranstation().remove(fragment);
2.添加新的Fragment。
getFragmentManager().beginTransaction().add(containerViewId, fragment);
这两步操作已经可以完美的实现了Fragment的来回切换(注意不要忘了commit()).但是这里就出了一个问题:我如何保存Fragment的当前状态!
笔者先前写过一个小Demo,大致的内容是将QQ服务器返还的用户头像与姓名设置到Fragment的相应文本上。那么这里问题来了,每当我切换到其他的Fragment时,再切换回来,QQ的用户头像和姓名不见了!
那么此时肯定有人会说,Fragment依赖于Activity存在,我们直接保存当前界面的现场不就可以了。
不!这样不行!因为方法根本不会被调用!
原因很简单,因为onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则 onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和 onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提 是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。
试想一下,实际开发中,我们获取到的第三方用户信息是要提交到服务器上的,难道我们每加载一次展现用户信息的Fragment就要请求一次服务器?
当然不可能这样,因为这样不仅会浪费用户大量的流量,还会出现加载延迟的一系列情况,甚至是用户的登录信息还未展现出来,用户的私人信息已经在其他界面展示了。
因此,我们迫切希望能有一个更好的方法,完美的解决这一类问题。
Fragment 的hide()和Show(),在进行Fragment的切换时,并不是Fragment的remove()和add(),而只是单纯的将Fragment显示和隐藏。
以下是笔者写的一个最简单易懂代码
这个是主界面的代码,我创建了一个RadioGruop,里面有三个RadioButton,点击不同的单选