项目杂谈–之即时通讯(底部Fragment)
最近做一个即时通讯的项目,如果你对这个项目名称不是很了解,那么打开你的手机qq,底部导航栏,有消息,联系人,动态这个三个按钮,那么依次的对应着三个fragment,当点击了某一个按钮,那么去加载一个fragment,首先我们可以声明三个fragment,依次叫做ContactFragment ,ConversationFragment, PluginFragment.
那么问题来了,如何去创建三个fragment,我们都知道fragment是放在一个容器中,并且是由我们的fragmentManager进行管理的,添加fragment的方式有两种
添加fragment的方式:
(1).replace 添加:
好比就是一个坑,等着我们创建好的fragment进行来填,
这种方式,我认为不是很好,这种方式添加会对fragment的生命周期有影响。当点击切换fragment的时候,原先创建好的fragment会被替换,重新去创建,这样就不是很好了,如果说我们切换到联系人这个fragment的时候,上一次还有数据的,下一次去点击的时候,还需要去重新加载数据,这样就不是很好了。
(2).add方式添加 :
这种方式,对于我们这个项目是比较不错的选择,怎么说呢,当我切换到另外一个fragment的时候,可以将其他的fragment隐藏起来,当被选中的fragment,让其显示处理,显示不会走Fragment的onResume 方法,隐藏不会走Fragment的onPause方法,因此不会对Fragment的生命周期有影响
2.Fragment的创建。
这个Fragment的创建直接是通过工厂类来实现的,大体思路如下:
让三个Fragment去继承一个基类BaseFragment,创建一个工厂FragmentFactory,在这个工厂中,我使用了单例设计,将三个Fragment全部声明称静态的成员变量,这样做的好处,就是保证了在整个应用中只有对应Fragment的实例对象,
public class FragmentFactory {
private static ContactFragment mContactFragment;
private static ConversationFragment mConversationFragment;
private static PluginFragment mPluginFragment;
public static BaseFragment createFragment(int position) {
BaseFragment baseFragment = null;
switch (position) {
case 0:
if (mContactFragment == null) {
synchronized (FragmentFactory.class) {
if (mContactFragment == null) {
baseFragment = new ContactFragment();
}
}
}
break;
case 1:
if (mConversationFragment == null) {
synchronized (FragmentFactory.class) {
if (mConversationFragment == null) {
baseFragment = new ConversationFragment();
}
}
}
break;
case 2:
if (mPluginFragment == null) {
synchronized (FragmentFactory.class) {
if (mPluginFragment == null) {
baseFragment = new PluginFragment();
}
}
}
break;
}
return baseFragment;
}