Fragment的一般使用

一.前言

  1. 本文基于androidX包下的Fragment,与support包下的Fragment"略"有不同,android.app包下的Fragment已于API 28被废弃
  2. 这篇文章应该算是一篇使用Fragment后的总结,不会讲特殊的使用技巧和使用角度,不会涉及过深的源码分析,仅仅说明一般业务场景下如何正确使用Fragment
  3. 很早以前就想写关于Fragment,但是那个时候因为对Fragment没有足够的场景使用积累,学习也只是为了为学习而学习,所以没有多少心得。自从接手了新项目,遇到了一些使用上的坑之后,心得就有了(笑哭),因为Fragment使用起来的确不想Activity那样趁手。所以有了这篇一般使用

二.Fragment初衷

android3.0推出之前,谷歌的开发人员就发现,市面上有很多app在同一个界面上展现是分区块的,不同的区块对应不同的界面展现和交互逻辑,当然也对应着不同的代码处理,可这些代码都是在同一个Activity中,造成Activity的代码很臃肿,不易维护。同时android平板开始兴起,如何在更大的屏幕上呈现更多的内容也是对开发者提出的一个问题。所以Fragment应运而生。就像下图一样,整个屏幕被分成了三个碎片(fragment),每个碎片将有自己不同的UI展现和交互逻辑。
如果仅仅是UI和交互代码交给Fragment,那它还不如叫Adapter。很显然,谷歌希望你能将管理区块的全部处理代码交给Fragment,包括Activity已有的生命周期,所以Fragment也有了生命周期。

三.使用

(一).原则

  1. 一个Activity尽量在一处代码块统一管理Fragment
  2. 和Activity一样,不需要由开发者手动调用生命周期
  3. 尽量像Activity一样将Fragment对象交由系统处理
    下面的代码为一个App主页面,底部tab切换的管理类,分别为构造方法和tab切换处理show()方法
public TabbarManager(FragmentActivity fragmentActivity, int fragmentContentId,
                            int tabCount, ArrayList<MainBaseFragment> fragmentList,
                            ArrayList<ImageButton> tabImgBtnList,
                            ArrayList<Drawable> tabImgCkedList, ArrayList<Drawable> tabImgUnckedList) {
        this.fragmentActivity = fragmentActivity;
        this.fragmentContentId = fragmentContentId;
        this.tabCount = tabCount;
        this.fragmentList = fragmentList;
        this.tabImgBtnList = tabImgBtnList;
        this.tabImgCkedList = tabImgCkedList;
        this.tabImgUnckedList = tabImgUnckedList;

        MainBaseFragment fragment = fragmentList.get(0);
        FragmentTransaction fragmentTrans = fragmentActivity.getSupportFragmentManager().beginTransaction();
        fragmentTrans.add(fragmentContentId, fragment);
        fragmentTrans.commit();
        fragment.fragmentDidAppear();

        setTabImgBtnSelected(0);
    }
    public void show(int index) {
        if (index < 0 || index >= tabCount) {
            return;
        }

        if (index == lastTabIndex) {
            if (fragmentList.size() > lastTabIndex){
                BBTMainBaseFragment fragment = fragmentList.get(lastTabIndex);
                fragment.onTabReselected();
            }
            return;
        }

        FragmentTransaction fragTrans =
                fragmentActivity.getSupportFragmentManager().beginTransaction();
        for (int i = 0; i < tabCount; i++ ) {
            ImageButton imgBtn = tabImgBtnList.get(i);
            BBTMainBaseFragment fragment = fragmentList.get(i);
            Drawable tabImgCked = tabImgCkedList.get(i);
            if ( i == index ) {
                // 显示tabbar
                imgBtn.setBackground(tabImgCked);

                // 显示内容区
                if (fragment.isAdded()) {
                    fragment.fragmentDidAppear();
                    fragment.onResume();
                } else {
                    fragTrans.add(fragmentContentId, fragment);
                    fragment.fragmentDidLoad();
                }
                fragTrans.show(fragment);
                fragment.onTabSelected();
            } else if ( i == lastTabIndex ) {
                // 隐藏tabbar
                Drawable tabImgUncked = tabImgUnckedList.get(i);
                imgBtn.setBackground(tabImgUncked);
                // 隐藏内容区
                fragment.onPause();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值