Android 教你简单封装多Fragment切换

《Android 教你简单封装多Fragment切换》

转载请注明来自 傻小孩b_移动开发
http://www.jianshu.com/users/d388bcf9c4d3
喜欢的可以关注我,不定期总结文章!您的支持是我的动力哈!

一、应用场景

viewpager+Fragment实现页面切换。在日常的应用首页、广告轮播、欢迎页、图片切换等等应用上,非常广泛、非常广泛(真的非常广泛哈)。前期刚好也写了一篇在多Fragment也面切换的时候也许会出现getActivity()为null的情况,有需要的的读者可以看下《Android 那些年,处理getActivity()为null的日子》。

对于多页面切换,比较常见程序猿的写法是,举个例子:

(1)初始化Fragment

       Tab1Fragment tab1Fragment = new Tab1Fragment();
       Tab2Fragment tab2Fragment = new Tab2Fragment();
       Tab3Fragment tab3Fragment = new Tab3Fragment();

(2)将Fragment存储在List后,初始化ViewPager适配器

        fragmentList.add(tab1Fragment);
        fragmentList.add(tab2Fragment);
        fragmentList.add(tab3Fragment);
        viewAdapter = new MainPagerAdapter(getSupportFragmentManager(),fragmentList,titleList);
        viewPager.setAdapter(viewAdapter);
        viewPager.setCurrentItem(0);//默認選中第一個

(3)通过实现setOnPageChangeListener接口,实现切换监听

   viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

二、应用ing->代码解说

事不宜迟,代码直接解说:
(1)定义一个存储Fragment实体类

 /**
     * ViewPageInformation
     */
    public static class ViewPageInfo {
        public String tag;
        public View view;
        public Fragment fragment;

        public ViewPageInfo(String tag, Fragment fragment){
            this.tag = tag;
            this.fragment = fragment;
        }
    }

其中tag用于Fragment标识,可以作为标题,看各位程序猿怎么定义。view指的是Fragment绑定的视图。fragment就不用多说啦哈。

(2)定义一个基类BaseTabFragment,适用于多Fragment切换的场景。


/**
 * 应用在需要多个fragment场景,ViewPager作为存储容器 viewpager依赖父类
 * Created by wsy on 2016/8/15.
 */
public abstract class BaseTabFragment extends BaseFragment{

    private ViewPager viewPager;
    private List<ViewPageInfo> fragList;
    protected FragmentStatePagerAdapter mAdapter;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        viewPager = (ViewPager) view.findViewById(R.id.viewpager);

        if (mAdapter == null){
            fragList = new ArrayList<>();
            addSubViewTab();
            mAdapter = new FragmentStatePagerAdapter(getFragmentManager()) {
                @Override
                public Fragment getItem(int position) {
                    return fragList.get(position).fragment;
                }

                @Override
                public int getCount() {
                    return fragList.size();
                }

                @Override
                public CharSequence getPageTitle(int position) {
                    return fragList.get(position).tag;
                }


            };
            if (viewPager !=null) {
                viewPager.setAdapter(mAdapter);
                loadFinishView(viewPager, mAdapter);
            }

        }else{
            if (viewPager !=null) {
                viewPager.setAdapter(mAdapter);
                loadFinishView(viewPager, mAdapter);
            }
        }
    }

    public FragmentStatePagerAdapter getmAdapter() {
        return mAdapter;
    }

    public abstract void addSubViewTab();

    public abstract void loadFinishView(ViewPager viewPager,FragmentStatePagerAdapter mAdapter);

    public void addTab(String tag, Class<? extends Fragment> fragment){
        fragList.add(new ViewPageInfo(tag, Fragment.instantiate(getActivity(), fragment.getName())));
    }

    /**
     * ViewPageInformation
     */
    public static class ViewPageInfo {
        public String tag;
        public View view;
        public Fragment fragment;

        public ViewPageInfo(String tag, Fragment fragment){
            this.tag = tag;
            this.fragment = fragment;
        }
    }
}


首先觉得切换视图是什么由继承于这个父类的子类所有决定,这里抽象了** addSubViewTab loadFinishView** 两个方法出来由子类去实现,** addSubViewTab** 主要用于子类决定初始化什么Fragment视图,** loadFinishView** 是在加载好Fragment视图后具体要干什么(比如ViewPager配置、Fragment视图操作等等)。因为这个代码是笔者配合tabLayout所抽象出来的一个父类。当然,在日常开发中,程序猿们可以将BaseFragment换成自己的基类Fragment。

(3)怎么使用?
使用很简单,在初始化这个Fragment的时候,实现addSubViewTab抽象方法即可,具体如下:

        mainTabFragment = new MainTabFragment() {
            @Override
            public void addSubViewTab() {
                //初始化视图 调用addTab
                addTab("标题1",Tab1Fragment.class);
                addTab("标题2",Tab2Fragment.class);
                addTab("标题3",Tab3Fragment.class);
            }

            @Override
            public void loadFinishView(ViewPager viewPager, FragmentStatePagerAdapter mAdapter) {
                mViewPager = viewPager;
               //加载好视图啦,想做什么做什么,都返回给你啦
            }

        };

        getSupportFragmentManager().beginTransaction().add(R.id.test_contanter,mainTabFragment).commit();
  

三、应用ed->实现效果

这里笔者实现了一个启动欢迎界面,并且加入了笔者个人上线应用 爱游记(欢迎吐槽使用,报bug哈哈,会用一两个月时间改版,到时候开源~)

运行效果如下:


爱游记欢迎.gif

四、总结

打下预告,最近一直在看Retrofit2.0,后面想写几篇关于Retrofit2.0的文章。好几天没总结笔记T T。今天大概讲了简单封装多Fragment切换,希望可以帮助各位读者~共勉!有什么问题意见也尽管提哈!

源码地址:

Android 教你简单封装多Fragment切换

傻小孩b mark
共勉,写给在成长路上奋斗的你

喜欢就为我点下喜欢吧:-D,感谢各位读者阅读。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容