即时通讯2

项目杂谈–之即时通讯(底部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;

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