美文网首页android应用框架Android开发分享it技术
Fragment之我的解决方案:Fragmentation

Fragment之我的解决方案:Fragmentation

作者: YoKey | 来源:发表于2016-02-28 22:25 被阅读50183次

    Fragment系列文章:
    1、Fragment全解析系列(一):那些年踩过的坑
    2、Fragment全解析系列(二):正确的使用姿势
    3、Fragment之我的解决方案:Fragmentation

    附:SwipeBackFragment的实现分析

    如果你通读了本系列的前两篇,我相信你可以写出大部分场景都能正常运行的Fragment了。如果你想了解更多,那么你可以看看我封装的这个库:Fragmentation。
    本篇主要介绍这个库,解决了一些BUG,使用简单,提供实时查看栈视图等实用功能。


    源码地址:Github,欢迎Star,Fork。

    Demo网盘下载(V_0.9.0)
    Demo演示:
    单Activity + 多Fragment,项目中有3个Demo。

    流式的单Activity+多Fragment:


    流式的单Activity+多Fragment

    类似微信交互方式的单Activity+多Fragment:(全页面支持滑动返回)


    类似微信交互方式的单Activity+多Fragment

    类似新版仿知乎交互方式的单Activity+多Frgment:


    类似新版仿知乎交互方式的单Activity+多Frgment

    Fragmentation

    为"单Activity + 多Fragment的架构","多模块Activity + 多Fragment的架构"而生,帮你简化使用过程,轻松解决各种复杂嵌套等问题,修复了官方Fragment库存在的一些BUG。


    特性

    1、可以快速开发出各种嵌套设计的Fragment App

    2、悬浮球/摇一摇实时查看Fragment的栈视图Dialog,降低开发难度

    3、增加启动模式、startForResult等类似Activity方法

    4、类似Android事件分发机制的Fragment回退方法:onBackPressedSupport(),轻松为每个Fragment实现Back按键事件

    5、提供onSupportVisible()等生命周期方法,简化嵌套Fragment的开发过程; 提供统一的onLazyInitView()懒加载方法

    6、提供 Fragment转场动画 系列解决方案,动态更换动画

    7、更强的兼容性, 解决多点触控、重叠等问题

    8、支持SwipeBack滑动边缘退出(需要使用Fragmentation_SwipeBack库,详情README)

    通过logFragmentStackHierarchy(TAG)查看Log

    如何使用

    1. 项目下app的build.gradle中依赖:

    // appcompat-v7包是必须的
    compile 'me.yokeyword:fragmentation:{version}'
    
    // 如果不想继承SupportActivity/Fragment,自己定制Support,可仅依赖:
    // compile 'me.yokeyword:fragmentation-core:{version}'
    
    // 如果想使用SwipeBack 滑动边缘退出Fragment/Activity功能,完整的添加规则如下:
    compile 'me.yokeyword:fragmentation:{version}'
    // swipeback基于fragmentation, 如果是自定制SupportActivity/Fragment,则参照SwipeBackActivity/Fragment实现即可
    compile 'me.yokeyword:fragmentation-swipeback:{version}'
    

    2. Activity继承SupportActivity:

    // v1.0.0开始,不强制继承SupportActivity,可使用接口+委托形式来实现自己的SupportActivity
    public class MainActivity extends SupportActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(...);
            // 栈视图等功能,建议在Application里初始化
            Fragmentation.builder()
                 // 显示悬浮球 ; 其他Mode:SHAKE: 摇一摇唤出   NONE:隐藏
                 .stackViewMode(Fragmentation.BUBBLE)
                 .debug(BuildConfig.DEBUG)
                 ...
                 .install();
    
            if (findFragment(HomeFragment.class) == null) {
                loadRootFragment(R.id.fl_container, HomeFragment.newInstance());  // 加载根Fragment
            }
        }
    

    3. Fragment继承SupportFragment:

    // v1.0.0开始,不强制继承SupportFragment,可使用接口+委托形式来实现自己的SupportFragment
    public class HomeFragment extends SupportFragment {
    
        private void xxx() {
            // 启动新的Fragment, 另有start(fragment,SINGTASK)、startForResult、startWithPop等启动方法
            start(DetailFragment.newInstance(HomeBean));
            // ... 其他pop, find, 设置动画等等API, 请自行查看WIKI
        }
    }
    

    进一步使用、ChangeLog,查看wiki

    相关文章

      网友评论

      • TA比烟花寂寞:fragment侧滑返回可以实现微信侧滑的效果,activity侧滑返回怎么实现这个效果啊
      • Zwww_:通过栈内的Fragment启动一个新的Activtiy,在调用这个Fragment的pop,但是并不能pop成功
        此时这个Fragment的Destory方法走了,但是退出新的Activity时,页面还是显示这个Fragment
        Intent loginIntent = new Intent(mActivity, LoginActivity.class);
        startActivity(loginIntent);
        pop();
      • 老鱼同学:点崩之后就各种fragment 错位了。。是不是我搞错了什么东西啊大神
      • 79a6e25c112f:我想问下为什么startForResult之后目标Fragment调用了setFragmentResult可是没有任何的回调是什么原因?
      • 我一定会学会:请问一下,多Activity,多Fragment的demo,github都是一个activity,其他全部都是fragment!我想一个模块,一个acitvity
        cxy92:推荐你使用谷歌的官方组件navigation component
      • 我一定会学会:请问一下有没有qq讨论群
      • 73e9aa7f8417:底部tab导航栏切换4个fragment,首次进入主界面同时加载了4个fragment,如何改为只默认加载第1个,其他3个在点击时加载,在线等,急,谢谢
        174edd514f0d:loadMultipleRootFragment(加载多个同级根Fragment,类似Wechat, QQ主页的场景)
        禅与发现的乐趣:首次只是创建了对象,你可以在fragment显示的时候加载数据啊
        我一定会学会:我也想问这个问题,请求解决了吗
      • 1bac7a58ea3b:大佬,我想问一个问题,如何关闭您这个库中的fragment跳转动画,因为需求是不需要动画的。如何去设置呢?
      • 4b097876e21d:// 启动目标Fragment,并关闭当前Fragment
        startWithPop(SupportFragment fragment)

        // 启动目标Fragment,并关闭targetFragment之上的Fragments
        startWithPopTo(SupportFragment fragment, Class targetFragment, boolean includeTargetFragment)

        大神请问下, startWithPopTo要怎么调用呀, 我都调用不了呀
      • f66a0999bb30:大神,今天发现用 EventBusActivityScope.getDefault(_mActivity).post(new StartBrotherForResultEvent());打开一个界面,onFragmentResult() 这个回调不一定会走, startForResult();打开就会走。哈哈。。。版本是1.2.5 。 StartBrotherForResultEvent这个方法里面调用的也是startForResult()方法打开的新界面。
      • zbiext:遇到一个问题,fragment有scrollview,里面嵌套了recyclerview,多个fragment切换时,scrollview会滑动到recyclerview的第一个item,怎么控制啊?onHiddenChanged没有被回调,请问用哪个方式知道切换在该fragment了?😂😣😣
        zbiext:@J_9527 还有一个onSupportInvisible
        f66a0999bb30:onSupportVisible
      • 9068f50b0bda:为什么首次调用主页调用loadRootFragment 会非常卡UI 还会导致黑屏 其中的子页是通过fragment 加载到布局FrameLayout的方式加载的 也是调用的loadRootFragment
        别吵在找8哥:哥们知道答案了吗?
      • d803f62206cc:请问大神,有没有针对您这个库建的讨论群呢
      • 對9當歌:双击返回键退出app,会重启,怎么办
        d803f62206cc:你双击的时候是不是执行了onBack....,你要是换一种方法不执行onBack....直接让应用退到后台,在没有杀死后台的情况下,再启动app的时候就不会重启了
      • c84a6998a6c6:希望能仔细讲讲你那个库的思路什么的,有的地方看不太懂,谢谢
      • 6782f22d70fc:我想问下为什么startForResult之后目标Fragment调用了setFragmentResult可是没有任何的回调是什么原因?
      • Eric_feng:我采用的时单Activity + 多Fragment的形式,返回主页面时会出现闪退,什么原因?是因为onBackPressedSupport()方法码?
        Eric_feng:@YoKey 好的,我看一下
        YoKey:@Eric_feng 看Log排查异常
      • Eric_feng:我最近在写项目时间,遇到一个问题,希望楼主帮忙解决,就是在使用类似新版仿知乎交互方式的单Activity+多Frgment时间,使用showHideFragment()去控制显示对应的fragment,可是我想每次切换都会自动重新获取新的数据,这个应该怎么解决,还是有提供对应的生命周期方法可以每次切换都会走,onResume()除外
      • 在路上lll:您好 我发现一个动画的问题,就是当activity调用fragment的setArguments()后,在这个fragment中启动另一个fragment,并调用setArguments()方法传递数据时,无法显示转场动画,不知道是我哪地方有问题还是哪的问题
      • 717f71b3d063:求问作者,我现在有个情况,用户按home键退出到主页后,如果Activity被回收,Activity调用onRestoreInstanceState()方法重新创建之后,Framgeng白屏,一直无法解决。
        经过调式,Acitivtity回收之后Fragment依旧走onCreateView onViewCreated等创建方法,我的初始化动作都在这两个方法中,虽然都有走,为什么白屏,测试机,小米5
        YoKey:避免重复加载Fragment,比如 在AC里加载Fragment时: if(fm.findFragmentByTag(fg) == null){ // 这种情况加载Fragment } // 否则不做任何事
      • 454b39345d5f:你好,请教一下fragment hide show 之后发现懒加载失效了,请问怎么解决这个问题?
        YoKey:所谓懒加载就是 第一次可见时才触发某个回调懒加载方法, 既然show过,以后再show自然不会再回调懒加载方法
      • 树叶秋:当一个fragment盖住另一个时,底下那个fragment不会onpause?
        YoKey:@树叶秋 add不会 replace会
      • 0b20b4975304:为什么切换fragment时候看不到动画呢,fragment内容很简单时只有几个textView就会看动画,如果fragment加几张图片就看不到动画显示了,怎么才能做到即使fragment复杂也能看到切换动画呢,
      • 462191cfd704:你好,我今天使用了你的这个框架,为什么我的没有返回栈,按下返回键直接退出程序了?
        YoKey:@如果没有她 参考下demo
      • 街道shu记:您好,我在做侧滑回退的时候,都是继承你的SupportFragment和SupportActivity,但是回退的时候显示上一个界面是黑屏,不能像你的demo中是显示半透明上个界面,请问这需要做什么设置吗?
        街道shu记:@YoKey 嗯嗯,已经解决了,加了ac的style,谢谢啦:blush: ,库很不错,点赞
        YoKey:@街道书记 阅读下swipeback的README
      • zhongjh:又发现一个问题,感觉是官方问题,我直接在你的demo上修改的。在CycleFragment添加一个edittext。运行之后,点击仿知乎app,然后点击列表的其中一项,再点击FloatingActionButton按钮跳转到CycleFragment,点击刚才新添加的edittext显示出软键盘。然后返回,会发现FloatingActionButton默认在最下面。。过几秒又跳回原来的位置
        zhongjh:@YoKey 不行,我分别在onBack和onDestory都clearFocus()。还是不行
        zhongjh:@YoKey 谢谢!具体是怎么解决焦点移除。是onDestroy的时候,把当前edittext的焦点移除吗
        YoKey:@qq名长是因为你没给我备注 软键盘的坑,可以把焦点移除 来解决这个视觉上的小问题
      • git浅寻:mToolbar.inflateMenu(R.menu.menu_xx);
        为什么我项目里用这设置导航按钮会发生错乱?
      • zhongjh:大神你好,我有个项目已经用你的框架用了3个月了,也更新新版本解决了一些新问题,但目前我研究了动画,发现基于你这个框架实现的话,有些问题,不知道你可以提供你联系方式来一起研究下这个问题吗?

        你现在这个框架的Transaction共享控件动画是只有返回,没有进入的

        如果是类似这种写法:
        fromFragment.getFragmentManager().beginTransaction()
        .replace(R.id.flContainer, toFragment)
        .addToBackStack(null)
        .addSharedElement(swipeLayout, "Content")
        .commit();

        就能完美呈现出进入和退出的共享动画

        望一起研究!谢谢大神!
        zhongjh:@YoKey 后面我是这么解决的,把你start的连续方法,传参都照搬过来,只是把start换成了replace,后来我发现跳转都没什么问题。。感觉start跟replace没什么区别
        YoKey:@qq名长是因为你没给我备注 replace官方一直支持的,add在25.1时支持,后续又不支持了:sweat:
      • 6fd1510e8ea9:我今天遇到一个问题, getSupportDelegate().startWithPop(new EcBotttomDelegate());
        但是我在某一个页面还是看到部分重影
        YoKey:@日亿年 没理解... 加我Q看下吧 私信你了
        6fd1510e8ea9:@YoKey 我是一个activity+fragment, 回调放到activity中,我在activity中 getSupportDelegate().startWithPop(new SignInDelegate()); 之前的fragment 不能pop
        YoKey:@日亿年 动画过程中重影吗? 是否必现 看下背景色是否有透明属性的存在 可以私信我
      • 老年追梦人:大神 :confounded: 为什么我这么菜
      • BKQ_SYC:MainActivity里面load出StartFragment,我重新start MainActivity,为什么里面的跳转的fragment都是空界面啊,怎么解决呢?
        BKQ_SYC: @frag 嗯,差不多,我用的是rxbus
        YoKey:@frag 解决方式 可以通过getParentFragment().start(), 这种方式启动;
        或者通过Activity作用域的EventBus来解决,我稍后会上传该辅助Module到Fragmentation
        YoKey:@frag 猜测你使用了EventBus来跳转, Fragment有个大名鼎鼎的异常:Can not perform this action after onSaveInstanceState , 产生原因: 第一个MainActivity处于不可见状态,在第二个MainActivity的Fragment 通过EventBus跳转时,第一个里的Fragment也接受到该Event,从而也start, 但是因为第一个宿主不可见,所以导致该异常,表现为页面空白
      • 技术宅的心:如何在不是v4包下的fragment,做backpress的数据恢复
      • winelx:demo报错无法使用啊,
      • 墨苏丶:老哥 我接了你的这个Fragment的库 现在栈里 有的时候会出现 SupportrequestMangerFragment 这个Fragment 这个是干什么的啊 .
        别吵在找8哥:@墨苏丶 哥们你内存重启的时候有没有出现空白页的?
        墨苏丶: @墨苏丶 66666大神给力
        YoKey:@墨苏丶 这个是Glide库的,用来监听生命周期的,不用管的,栈视图会把栈内所有fragment展示出来
      • xiaobailong24:下一个要学习的开源库,看看跟自己遇到的坑是怎么解决的!😇😇😇
      • 358c03f168e3:看完的大神的文章还是有点迷迷糊糊的。。我这边有一个问题,是大神文章中没有提到的,大神曾经使用多Activity和多Fragment的框架的时候,会不会出现FragmentManager is already executing transactions的情况,具体是在Fragment跳转到ActivityB,ActivityB内有一个ViewPager,结果加载ViewPager的时候报了这个错误,请大神解惑,是什么原因
        YoKey:@Platycodon丶 从v4 25.2开始 官方不允许在onResume等绝大多数生命周期内执行 executePendingTransactions()
      • 墨苏丶:老哥 我导入项目的时候 报 failed to resolve: com.android.support:appcompat-v7:25.4.0这个错 啊怎么回事 啊 ..SDK也没有更新 ,按照网上的方法添加了 maven.google.com也 不行啊..
        YoKey:有时Google的maven会被墙或出问题, 可以翻墙拉下support库,或者拉取26.0.1的最新版
      • a0c21083e95e:大神,发现跳转到一个带recyclerview 的Fragment,动画会卡顿,求解,多谢
        YoKey:@Alexander_5193 issue上已回复
      • 47fe3088500c::pray: 看傻了 膜拜膜拜
      • 81c17c76d562:博主。你好,我用下面tab加fragment布局,使用show/hide,当发生内存重启时候,会造成空白,fragment不显示,请问这是什么原因?
        YoKey:@Mr_Wrong丶 是否有判断 if(saveInstanceStats == null){ // 加载Fragment } 的处理
      • JohnsonZZZ:感谢技术分享,楼主 我这边采用了你的Viewpager + 多个fragment建议,只是在内存重启的时候findFragmentByTag,最后在实际项目中发现了很多空指针的异常,不知道是不是我的处理方式有问题。后台捕获了大量的异常:
        java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
        at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:380)
        at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:375)
        at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:103)
        at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1034)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1182)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1116)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642)
        at android.view.View.measure(View.java:19141)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:825)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:511)
        at android.view.View.measure(View.java:19141)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6245)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:223)
        YoKey:ViewPager下的Fragment不用做内存重启的处理(不用findFragmentByTag),每次直接绑定Fragment即可,FragmentPagerAdapter内部做了处理的
      • 旋哥:这个库确实强大,赞一个
      • 377ad02904d0:我是刚刚接触Fragment的,看了你的这几篇文章,觉得写的真的好,只是我自己似乎无法将这些知识整理到自己的大脑中。有什么建议吗
        YoKey:@低姿态_8118 我们一般情况下仅会在简单场景使用,了解下Fragment的相关基础知识点就够了,如果对App速度等有要求,大量使用Fragment的话,需要深入了解~
      • 1d9cd5649d21:你好楼主,我这里用popTo方法在runnable里面执行start方法,总会闪一下最底下的根fragment的页面,这个有没有什么好点的方法能解决
        1d9cd5649d21:@YoKey 在手机上看起来还好,我做的pad项目上只要调用popTo就会闪,不知道是不是我写的方法有问题
        YoKey:@我是小白a 另外是每个机型都闪吗? 目前版本的popTo() 经过测试还没发现闪的问题,Demo是否闪
        YoKey:@我是小白a 近期会推1.0版本,popTo动画机制优化了
      • Dora_Liang:@BangAiN demo中底部菜单,我能替换成
        RadioGroup实现吗?
      • 庭誉:大神,在activity里.newInstance();会瞬间的黑屏,我自己用这个框架和知乎的demo好像都有这个问题
      • 摩卡不要糖:大神,你好,我现在在用你这个库,简单粗暴很直接的解决了我很多的问题,现在我遇到了一个问题,就是那个 MenuListFragment ,这个我遇到了问题,加载不同的fragment,我是在ContentFragment中的onCreateView根据点击的TextView.getText()的不同加载view,这样很麻烦,想问问还有没有什么好一点的方法,希望可以跟大神私聊
      • ce0c424a0fb8:楼主你好,文章写得非常详细,很感谢,同时有个问题想请教一下,您有遇到过backstack被系统清空的情况吗?最近在做一个类似于文件管理器的项目,每点击一个文件夹就会new出一个新的fragment加载文件列表,旧的fragment加入回退栈,点击回退按钮就从回退栈pop出旧的fragment,恢复上一级文件列表,平时使用一切正常,但是在很偶然的情况下(有可能后台久了恢复的时候,不一定都发生),会发生getBackStackEntryCount == 0 的情况,但是之前里面是有好几个fragment的,能不能帮忙分析一下可能哪里出现问题呢?谢谢!
        ce0c424a0fb8:@YoKey :yum: 谢谢您的分析,可能这个bug隐藏太深了,我折腾了半小时还是复现不了,即使设置不保留活动,恢复也是没问题的,现在只能等其他小伙伴测出来再分析了
        YoKey:@地上喷洒不了 首先系统会帮助保存和恢复 栈内的Fragment的,getBackStackEntryCount == 0 可能是:
        FragmentManager对象不对,使用了错误层级的FM了,所以该FM里可能本来就没有Fragment;

        你可以简单复现被杀的场景 : 开发者模式-> 不保留活动 打开,然后回到桌面,再进入,页面白屏一会代表被强杀
      • poppyss:老铁 isSupportHidden这个怎么成了非静态了
        poppyss:@YoKey 谢谢老哥
        YoKey:嗯 这个方法0.8后不再开放了,库提供了懒加载方法了; 可以看wiki :https://github.com/YoKeyword/Fragmentation/wiki
      • 240b50cbfcf3:starWithPop一个Fragment后,为嘛会闪现前一个framgent 啊
      • de158de6d9e0:我使用时出现了一个问题:在一个activity的根fragment中跳转到另一个fragment再回来跟fragment会卡死,不知道为什么。大神们知道吗?
      • 6f01852d1c5c:调试了两天,发现滑动返回和SwipeRefreshLayout冲突,SwipeBackLayout 的事件被refreshlayout拦截掉了
        6f01852d1c5c:是我写错了,没有问题:dizzy_face:
      • 0bb0aa4a680e:demo中软键盘按导航栏的返回键可以隐藏,但是按toolbar上的返回则无法隐藏
      • 340170993cda:大神您好, 我用的你的框架,单activity,现在用slider框架,上下滑动退出fragment,可以我这退出后还有一层白色背景没有从屏幕移除,这种情况有好的解决方法吗
        YoKey:@Droidrzy 你可以fork fragmentation-swipe的库 然后实现上下滑动退出功能哈~ 如果完成的话 可以提PR哈~ :stuck_out_tongue:
      • Deps:demo有个小小的bug,就是进入第二个SupperFragment,快速按击返回键两下,会直接退出两个SupperFragment,第一个SupperFragment的返回键监听(有弹出toast(再按一下退出),但是不需要两下)退出算法出错了。
        YoKey:@Deps 非常感谢,这竟然是个BUG, 点击过快时,当前Fragment的onBackPressedSupport()被连续调用2次,第二次点击时应该是上一个Fragment去消费事件~ 已修复 🙏
      • 黎清海:大神你好,我是用的最新的0.7.13的库,你的说明中是说有防手抖,但我实际使用中还是会出现点击过快加载出两个Fragment的情况,不知道是不是我的使用方法有问题,需要调用什么方法吗
        YoKey: @黎清海 嗯? 防手抖是针对fragment的
        你运行下demo看看吧
        黎清海:@YoKey 不太明白,是不是必须通过supperActivity里面的start()才能有防手抖,因为目前刚开始用,都是通过一个普通activity跳转到supperActivity,然后防手抖无效
        YoKey:@黎清海 在你start()时防抖动启动, 当在你新Fragment的onActivityCreated()回调时,防抖动失效。
        所以如果第一个Fragment已经是onActivityCreated()时,再点击就会启动第二个。 不必调任何方法的
      • HZWei7:楼主很热心。
      • bimromatic:楼主我有一个问题,仿知乎的demo 比如说:我从我的页面跳转登录页面,
        登录后跳转mainActivity 怎么让其显示的是刚点击跳转的fragment(我的) ,并且数据发生变化呢! 我发现你这个demo 好像实现不了,当我退出登录时候,按home 键会先跳到数据清空的界面然后退出
        bimromatic:博主能留个联系方式不
        bimromatic:@YoKey 是ac
        YoKey:@祭耶冷 登录页是fg还是ac
        通知数据变化 如果建议eventbus
      • 2e1b1e0c6f28:老司机开车果然厉害 学到了很多 有个问题请教 仿微信交互demo 如果只想让其中一个replace 其他的hide和show可以实现吗?
        YoKey: @Mercy丶涛
        可以实现你想要的效果 但是栈结构是需要调整的:
        想replace的那个tabFG,不要直接去replace(不要尝试add和replace在同一栈层级混合使用),而是add一个空的父容器FG, replace的是这个父容器fg里的子fg
      • 树叶秋:楼主,今日,玩了一下demo,崩了一次(印象中是滑动关闭时导致的);还有一个就是除了home,打开其他页面都呈现空白了
        树叶秋:@YoKey 之前出现的问题,是我从github上下载源码编译后的demo出现的,应该是最新版本,我再试试能不能重现。
        现在我想请教个问题,看你前两篇文章中提到用viewpager可以不考虑fragment的保存问题,
        但是使用viewpager后,fragment生命周期不能正常运行了:getitemposition返回-2时,全部fragment都会在notify后重建,返回-1时,notify后生命周期完全不执行。有没有办法在我remove一个fragment,notify后只销毁我remove的fragment,其他的保持原状呢?
        YoKey:@树叶秋 文章内的Demo链接刚更新了下,现在是最新的0.7.13版本; 可以再看看 :smile:
        YoKey:@树叶秋 是文章链接的Demo还是 github上编译后的Demo呢
      • 8a35efae58b3:建议multi root fragment中能自定义tag,现在是传入fragment的class,但有些页面多个相同fragment时,通过find fragment找不到
        8a35efae58b3: @YoKey 点赞点赞
        YoKey: @lolixes 嗯嗯 之前有小伙伴也提过 等回头闲下来搞0.8版本 把这个功能加入进去
      • 繁华落寞的世界:类似于 网盘 的那种文件目录结构,你认为是用fragment回退栈的方式解决 ,就像你知乎demo 里面的shopFragment 那样的解决方式,还是用listview 不断setData ,而回退的数据在点击进入的时候保存在list集合里面这种方式好?哪种内存优化更好?
        繁华落寞的世界:我想移植你知乎demo shopFragment那个回退栈的方式,发觉想迁移到项目中比较麻烦,你这封装的环环紧扣.倒入依赖库发觉很多都没用到.比较难抠代码
        YoKey:@繁华落寞的世界 建议Fragment:
        1、拓展性没得比
        2、管理数据的方式更优雅:栈的方式
        3、内存不足 页面重启时, listview的方式难办~
      • 8085c4191aa6:你好,请问怎么隐藏底部导航栏,第二个demo里找不到,本人小白,见谅 :smile:
        YoKey: @teddyxixi bottmbar添加这个功能就可以啦
        8085c4191aa6:@YoKey 非常感谢,学习到了。要是要仿微信,有新动态会显示小红点能实现吗?
        YoKey:@teddyxixi 通知 持有BottomBar的MainFragment, 控制其隐藏,显示 可以用EventBus
      • a82cc1677594:博主你好,请教一下。
        在你的模仿知乎示例中,第二个Tab页ZhihuSecondFragment类中初始化方法这么写:
        loadRootFragment(R.id.fl_second_container, ViewPagerFragment.newInstance());
        然后在ViewPagerFragment中再处理ViewPager切换三个Fragment。
        为什么不直接在ZhihuSecondFragment类中处理ViewPager呢?这样不是少一层Fragment嵌套吗?
        YoKey: @zhyihui 当然也可以, newInstance只是一种比较推荐的方式
        a82cc1677594:@YoKey 再麻烦一下,请问你在代码中使用newInstance方式创建Fragment,跟我用new xxxFragment创建在使用Fragmentation库的情况下一样吗?区别在于你代码中给Fragment一个Bundle参数,我直接用new创建Fragment可以吗?
        另外再请教个问题,比如ViewPager中有4个Fragment,分别为ABCD,切换到C时A被销毁,切换到D时B被销毁,这个在Fragmention中有办法处理么?
        YoKey:@zhyihui 仿知乎的交互方式决定了: ZhihuSecondFragment就需要是个容器, 你可以结合栈视图思考下就明白了
      • YoKey:1、建议EventBus,EventBus在Fragment之间非常方便,不必像Activity那样还要考虑Sticky特性
        2、同样EventBus,让A去刷新 :smile:
        YoKey:@吖灬灰机 是这样的,我所有开发的app,不管大小,都基本会使用EventBus这个库,因为当1对多,多对1,跨组件等行为下,EventBus可以优雅的解决这些问题;

        我理解你的意思,就像BroadCast是给App之间通信使用的,LocalBroadCastManager是App内部的通信使用的, 你想有个东西可以让其在Activity内的Fragment之间通信;

        这个之前有考虑过,这方面会再留意下; 因为这个随着业务的复杂会带来一些问题:比如,
        如果我这个AC下的某个Fragment需要和另外一个AC的某个Fragment通信,可能又需要不得不使用EventBus这样的库了; 除非这个库可以做到任意宿主AC下的Fragment之间都可以通信~

        至于实现,肯定是基于观察者模式的一套方案了;回头考虑下哈
        4de765d5dfc6:@YoKey 如果基于SupportFragment,然后实现,或者抽象出Fragment的通信的方法,这样会不会更好一点,当然,还是得基于FragmentActiivty的。希望这点能理会我所要表达的
        4de765d5dfc6:@YoKey 有舍必有得,我能明白EventBus的好处,确实是像楼主您说的那样,好东西!但是如果不选择用EventBus的话,那么是否能满足我刚刚说的那样的?
        因为基于Fragment间通信的,我感觉应该是必须要的,
        又换句话说,如果我单单只是为了这个fragment间通信,就要去引入EventBus(理想状态下,还没有用到过这个),然后为了这个需求,而去引入,会不会说不过去
      • 4de765d5dfc6:SupportFragment这个类是否有支持开放接口出来,供与其他的Fragment来通信?
        因为这个是很通用的,无论是平级还是顺序的,都是需要必须的;我看了demo,看到了使用EventBus的来交互的,我个人而言,并不是会选择这个,所以就想问下,是否能F跟F之间来相互通信
      • 4de765d5dfc6:你好,我想问下,栈中有A-B-C这样的顺序,然后如果出现下列两种情况
        1:他们3个是平级的,这个时候我C(可以是A或者是B)操作了,然后要通信其他两个,是否有解决方案
        2:如果不是平级的,此时我C处理完数据,然后同时A刷新,此时还是显示C界面的,是否能支持?
      • db5535c4116c:demo中从菜单选择商店,再点开菜单选择主页会crash
        Process: me.yokeyword.sample, PID: 21063
        java.lang.IllegalStateException: Fragment already active
        at android.support.v4.app.Fragment.setArguments(Fragment.java:548)
        at me.yokeyword.sample.demo_flow.MainActivity$2.run(MainActivity.java:149)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5438)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
        db5535c4116c:@YoKey 辛苦,多向你学习,感觉到差距很大
        YoKey:@鷓鴣仔 Demo已修复 :smile:
        YoKey:@鷓鴣仔 感谢提醒,最新版本添加了setArugments来给SingleTask模式传递数据;
        但是已经在栈内的Fragment是不能调用其setArugments()的,会报你提示的异常~

        看样上次提交我还是得回滚,还是统一用库里的putNewBundle()来传递数据~ :pray:
      • songx:博主 绘制4X 了,要减少绘制。
        YoKey:@songx 该库只有在不使用SwipeBack特性时,会多绘制一层,因为确保动画的正常执行,相比Activity的重量级,这个绘制牺牲完全可以忽略不计哒~
      • tpkeeper:嗯,解决了,在activity 的onstart中调用就行了
      • tpkeeper: getSupportFragmentManager().beginTransaction()
        .add(R.id.frl_content,homeFragment,homeFragment.getClass().getName())
        .hide(homeFragment)
        .add(R.id.frl_content, invertFragment,invertFragment.getClass().getName())
        .hide(invertFragment)
        .add(R.id.frl_content,assetsFragment,assetsFragment.getClass().getName())
        .hide(assetsFragment)
        .add(R.id.frl_content, moreFragment,moreFragment.getClass().getName())
        .hide(moreFragment)
        .commit();
        getSupportFragmentManager().getFragments().size();
        大神,最后一句为啥报空指针异常?我是放在activity的oncreate里的
        YoKey:@tpkeeper 因为Fragment事务是个异步的过程 =。= 所以事务代码后紧接着打印size会空...
      • 真的是叫时光啊:楼主,你封装的类库,我跟着走这走这就走不下去了。只能看Demo了。楼主,这真的是我见过对Fragment写的最好的文章,Demo写的特别精彩,以后我的项目估计就会照搬这个类库了。Demo看了一半了,发现我以前Fragment的用法都好垃圾啊。看完Demo后,会将看不懂的Fragmentation类库中的代码发给您,还望您能解析一二
        YoKey: @真的是叫时光啊
        一方面是demo没太注意这方面 写的比较糙,主要演示一些用法~
        另一方面是库中的Fragment都是有背景色的,即使你没设置,这是为了动画和侧划返回显示正常而添加的,所以会多一层,其实是可以接收的~ 侧划功能即使是Activity也是会多一层的
        真的是叫时光啊:您好,我发现您的Demo有着比较严重的过度绘制,基本上打开之后都是红色。不知道有没有什么好的解决办法
        YoKey:@真的是叫时光啊 demo还有很多不足,最近比较忙,后续demo会持续精简完善,争取用最简洁的代码覆盖所有Fragment场景~ :joy:
      • 2e5e148f4f89:博主,单Activity的话底部Tab栏会有一直带着,进入第二级fragment时能不能把底部tab栏去掉呢?
        YoKey: @潇杀狂 有任何问题欢迎反馈哈~
        2e5e148f4f89:@YoKey 看到了,公司的项目我直接用的你的这个框架,真的很感谢 :pray:
        YoKey: @潇杀狂 参考第二个demo
      • 3530c9ba7e8b:写的不错,可以考虑将fragment的生命周期改成仿activity的,这样在add一个新的fragment的时候能够触发前面一个fragment的onPause方法方便处理
      • 龙龙有药:楼主 能否请教一下 页面使用了3个fragment 需要控制其中的一个fragment 显示 隐藏 也可以重复生成

        findFragment
        _mActivity.getSupportFragmentManager().getFragments();
        都无法找到对应fragment 从而 出栈pop 无效
        理解能力有限 看不太懂您是如何处理的


        龙龙有药:@YoKey 作者回应的真及时 我也发现了呢 哈哈 不过还是不是很理解栈关系
        龙龙有药:已解决
        YoKey:@arilpan 你理一下栈关系,是不是在子栈:需要用findChildFragment(F.class)
      • thsai:楼主 比如我现在有个需求,有三个fragment 现在我切换fragment的流程是从A->B->C 此时显示的是C fragment,按返回键回到上一个fragment怎么做?我看了你的demo,是这样写的
        @Override
        public void onBackToFirstFragment() {
        mBottomBar.setCurrentItem(0);
        }
        你这个是显示指定的fragment,但我现在不知道C的上一个fragment是哪个,(因为有可能现在的流程是A->B->A->C),那要怎么做呢
        YoKey:@thsai 同级的不会这样的啊~ 不合理~ 非要用的话~可以用栈记录下~
        thsai:我是实习生,老大让我模仿他们的APP重新写一个,但是他们的是这样实现的啊, :joy:
        YoKey:@thsai 这样的需求不合理~ 让产品反思写检讨...
      • ed38f1a3801d:非常感谢博主的分享,良心之作,已打赏,期待更多干货分享! :+1:
      • 小范屯:内存重启 怎么复现,怎么模拟?
        YoKey: @小范屯 DDMS 或者 开发者模式
        或者(页面重启)屏幕旋转
      • b6c7a3ded5ff:最近正准备整这个,楼主搞个群多交流交流啊 :smile:
        YoKey:@叨叨的蚂蚁 当然可以~
        b6c7a3ded5ff:@YoKey 有个问题,我要是从一个Fragment页面跳转到一个activity页面 我可以直接用Intent方法来做吗?
        YoKey:@叨叨的蚂蚁 最近私事有点多~ 群先等等哈~ 有问题可以私信交流哈~
      • emial:你好, 我在写Activity + 多Fragment时出现一个坑,使用replace添加一个fragment时,setCustomAnimations的enter动画不会执行,不知道你有没有遇到过类似的情况,请问有没有解决方法
        YoKey:@emial 印象中有人给我说过也遇到这个问题 最后是代码书写有问题,可以检查下代码看看~
      • 英勇青铜5:求教,好像没有看到有关延Fragment迟加载的处理啊。尤其是有了一个广告轮播后,切换到另外一个fragment,怎么处理轮播图啊
        YoKey:@英勇青铜5 客气啦~ :blush: 有问题随时交流~
        英勇青铜5:@YoKey :smile:大神这么快就给回复了啊。这几天把你的库多看看,学习
        YoKey:@英勇青铜5 这个需要你自己根据实际情况处理,库的本意是可以简单的构造出单AC+多FG 等重度使用FG的架构,这种细节还是要根据实际需求来自己拓展的。

        Demo里有show/hide同级切换时的懒加载处理BaseLazyMainFragment,还一种懒加载情况时ViewPager时的懒加载,网上可以找到方案。
      • 2d8533a83ac8:你好,能具体说一下,懒加载的思路吗?什么时候该懒加载呢
        YoKey:@依然TMAC 内存重启前,FragmentManager会帮我们保存Fragment(通过onSaveInstanceState),内存重启后,帮我们恢复,如果此时不判断save==null,则会重复加载一次Fragment,这同时也是Fragment重叠的一种可能,建议你看下我的Fragment重叠的2篇文章 :blush:
        2d8533a83ac8:@YoKey 明白了 :smile: ,我看了你写的ZhihuFirstFragment的源码,其中的initLazyView方法里面为什么要判断if (savedInstanceState == null)才加载呢,当内存重启的时候不是应该加载吗?
        YoKey:@依然TMAC 一般2种情况:
        1、类似QQ那种通过show/hide 控制TabFragment的场景(如果你是在初始化时就把所有TabFragment都加载进来时)
        2、ViewPager+Fragment的场景(因为默认FragmentPager(State)Adapter会加载当前Fragment临近的1个Fragment)
      • BangAiN:博主 又没有可以用到eclipse的包
        BangAiN:@YoKey 是呀
        YoKey:@BangAiN 建议你复制下吧,没有多少个文件的 :stuck_out_tongue_winking_eye:
      • 30cfdeea225e:Fragmentation库用起来很方便。以前的版本改了一次eclipse的JAR工程 用起来很方便点个赞
      • supersugar:你好,我想知道这个库搭配其他的一些底部导航栏使用不知道会不会有什么问题?我看项目里面是你自己实现的底部栏
        比如https://github.com/roughike/BottomBar这个,现在项目里在用
        希望博主能回复一下,非常感谢
        supersugar:@YoKey 谢谢,又迅速有热情,一点都不像大街上那些浮躁的程序员 :stuck_out_tongue_closed_eyes:
        YoKey:@supersugar 切换Tab时,使用showHideFragment()方法控制,就可以了~
        YoKey:@supersugar 只要是通过自己来控制加载Fragment就可以直接用Fragmentation库。
        这个库我看了README,应该是可以的,在加载Tab Fragment时,使用loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments) 方法加载根部的TabFragment即可 :blush:
      • 文淑:你好,发现页面 列表滑动不到最底部,被屏幕盖住了一部分
        YoKey: @文淑 …… 额 感谢反馈,我回头看下 这是demo写法有问题 不影响库哈
        文淑:你好,这样底部是好了,可是顶部又被覆盖了
        YoKey:@文淑 非常感谢提醒,是layout_behavior设置的有问题,导致有时会出现这个显示异常,已经修正了 :pray:
      • Marno:我集成到项目中使用了一下,发现一些问题,在平级的fragment中,不能保留Fragment的状态。在流程式的Fragment中,当两个fragment在同一Activity,并且调用同一回调方法,这个回调方法中都需要传入Acticity时,回调时会同时调起两个Fragment中的方法,使用的是0.6.X的库
        YoKey:@Marno :blush: scheme有空研究下,看是否有可行性哈,感谢建议~
        Marno:@YoKey 公司的项目很多地方需要使用scheme跳转,需要在清单文件中配置,这样的话使用Fragment会有很多限制。要是fragment也可以通过scheme配置就好了,所有界面基本都能复用了,变来变去也不用担心了!很赞!
        YoKey:@Marno 0.7之前的版本 不支持平级Fragment和嵌套Fragment的恢复,同时调起2个Fragment的问题,你需要在设计方法上改变下,使用Fragment本身就是有些局限的。
        强烈建议用最新的0.7X版本,升级非常大,可以看看库里新的仿知乎Demo,同时新增了wiki,有比较详细的说明。 :smile:
      • ba26dcfebba4:你好楼主,我使用了你这个Fragmentation库(0.5.2),出现了一些问题,能否指教下。我的注册Activity上有3个Fragment,是流程式的,比如 注册1--》注册2--》确定完成 ,我的启动方式是starFragment(单例),到了第三个fragment的时候,出现了EditText点击无法输入,光标不动,多个EditText无法切换的问题,问题出在 一部华为一部三星上,但我自己的魅族还有同事的tcl没有这个问题。
        ba26dcfebba4:@YoKey 不光是editText,整个页面像卡住了一样,我的button也失去了点击效果,但能点击,我在editText中输入的文字信息,在我关闭fragment的最后一刻,就出现了,但页面已经关闭了。
        YoKey: @为爱疯狂D 可以加下我QQ 328903522 我需要看下你的写法 不过还是务必用最新版
        YoKey:@为爱疯狂D 只是EditText出现了奇怪问题吗? 待我回头用华为手机的测下。
        另外你试下最新的库,看是否还会出现该问题 :smile:
      • walkthehorizon:很棒,看你文章之前还是有很多疑问的,现在好了,清晰多了,已支持并star,感谢
      • GoodGoodStuday:大哥,进入fragment 反复的加framgent 和 加入新的framgent销毁当前的framgent 这两者反复的进行,,,但时候会崩掉的。。 2、<更新重大模块>那,能分享一下源码。。
        GoodGoodStuday:@YoKey 我不知道最新版本会不会出现这个问题,,我碰到的问题是 五月份那时,测试时看到的
        GoodGoodStuday:@YoKey 点击 《发现framgent + ViewPager》 进入里面,,如果快速点击的话, 点到80个(就是数量多一点) 然后换一下 按钮,,程序会崩掉的。。
        YoKey:@小宝拜财神 额 你说的有点模糊,是哪里? 源码在github上, 文章开头结尾都有 :smile:
        在设置转场动画时,尽量不要直接在onCreateView里立即进行其他Fragment事务操作,考虑放到主线程的消息队列里(Handler.post)
      • atomic_volatile:这杀器得好好研究一下~
      • BangAiN:👍我想问一下 @YoKey 关于fragment中swipeback滑动返回上一层的比较好的实现方案。
        YoKey:@BangAiN 这个我已经写过一篇实现原理的简书啦 http://www.jianshu.com/p/626229ca4dc2
        另外我的Fragmentation库有个滑动返回的拓展库,如果觉得重的话,可以看我的单独的SwipeBackFragment库,地址在发的这篇简书链接里都能找到 :smile:
      • AndroidCJJ:写的很好 欢迎加入 :https://github.com/LittleFriendsGroup/AndroidSdkSourceAnalysis
        YoKey:@FuckCJJ 谢邀,不过最近实在比较忙,先watch下,关注~
      • 1c010012c597: handleBack()方法是不是应该把
        fragmentManager.popBackStack();
        放在第一行执行,放最后一行执行时,返回结果创建新fragment的话,直接就把新的返回了,
        旧的还在。。
        1c010012c597:@YoKey 随便我用PopupWindow时,发现按返回键没有关掉弹窗,而是返回了fragment
        不知道是不是我的PopupWindow的使用姿势不对。
        1c010012c597:@YoKey Fragmentation.handleBack()
        pop()时会执行到这个。。。。我汗,你写的好吧。
        执行下面
        setFramgentResult(RESULT_OK, null);
        pop();
        我在返回结果后会启动另一个Fragment,这时发现pop掉了新启动的Fragment的
        YoKey:@1c010012c597 额 没有理解你的意思 能说明详细在哪个地方吗? 我没找到handleBack()方法 :joy:
      • 阿飞咯:感觉坑好多啊 楼主有时间单聊啊
        YoKey:@昨天还是一个小白 :smile:
      • stay4it:老司机很给力,这些坑都是泪吧 :smile:
        我都是绕过这些坑,直接replace+缓存刷新的。
        内存重启也是finish所有activities,重走app流程的。
        看来我也该参考下你的方案。感谢分享。
        YoKey:@stay4it 我的思路是这样的:在写任何一个Activity以及Fragment时,我会考虑当发生内存重启时,哪些变量需要通过onSaveInstanceState保存下来,包括你说的static变量,保存后,我在onCreate里判断saveInstanceState!=null的情况下,把这些变量恢复。
        只用Activity的界面,绝大多数场景下,不需要做保存。但是一旦牵扯到Fragment,需要保存的变量的场景就多了很多,这也是Fragment坑多的一个体现,因为需要考虑的变多了 :joy:
        stay4it:@YoKey
        嗯嗯,问题倒不是出在activity和fragment的重启,而是那些static变量的重新初始化。
        总不能不用static,也不能所有的都声明成单例。不知道这块你是怎么考虑的。
        YoKey:@stay4it 建议还是做下恢复啦,这个研究好内存回收机制,用户体验提升还是很明显的~ :blush:

      本文标题:Fragment之我的解决方案:Fragmentation

      本文链接:https://www.haomeiwen.com/subject/ixjwkttx.html