Fragment第三方框架推荐(Fragmentation)

单个Activity+多个fragment的架构可以让应用更加轻便灵活,跳转的UI响应速度更快,但是fragment的坑还是比较多的,这里推荐一个第三方框架Fragmentation,使用起来还是很方便的。

一、导入

api 'me.yokeyword:fragmentation:1.3.8'

二、初始化


publicclassAppextendsApplication{

@Override

    public void onCreate() {

super.onCreate();

Fragmentation.builder()

// 设置 栈视图 模式为 (默认)悬浮球模式  SHAKE: 摇一摇唤出  NONE:隐藏, 仅在Debug环境生效

.stackViewMode(Fragmentation.BUBBLE)

.debug(BuildConfig.DEBUG)// 实际场景建议.debug(BuildConfig.DEBUG)

/**

                * 可以获取到{@link me.yokeyword.fragmentation.exception.AfterSaveStateTransactionWarning}

                * 在遇到After onSaveInstanceState时,不会抛出异常,会回调到下面的ExceptionHandler

                */

.handleException(newExceptionHandler() {

@Override

public void onException(Exceptione) {

// 以Bugtags为例子: 把捕获到的 Exception 传到 Bugtags 后台。

// Bugtags.sendException(e);

                    }

                })

                .install();

    }

三、Activity继承SupportActivity并加载首页fragment

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        loadRootFragment(R.id.fl_container, MainFragment.newInstance());

//全局改变Fragment的动画

setFragmentAnimator(newDefaultNoAnimator());

    }

提示下,fragment切换动画共有3种,无动画、横向和纵向切换,分别是DefaultNoAnimator、DefaultHorizontalAnimator和DefaultVerticalAnimator

返回键监听可以这么写:

@Override

publicvoidonBackPressedSupport(){

if(getSupportFragmentManager().getBackStackEntryCount() >1) {

            pop();

}else{

ActivityCompat.finishAfterTransition(this);

        }

    }

四、Fragment继承SupportFragment

publicclassMainFragmentextendsSupportFragment{

privateUnbinder unbinder;

publicstaticMainFragmentnewInstance(){

returnnewMainFragment();

    }

@Override

publicViewonCreateView(LayoutInflater inflater, ViewGroup container,

                            Bundle savedInstanceState){

View view = inflater.inflate(R.layout.fragment_main, container,false);

unbinder = ButterKnife.bind(this, view);

//        动态改动 当前Fragment的动画

//        setFragmentAnimator(fragmentAnimator);

returnview;

    }

@Override

publicvoidonDestroyView(){

super.onDestroyView();

if(unbinder !=null) {

            unbinder.unbind();

        }

    }

}

Butterknife的内容可以无视

五、Fragment跳转到另一个Fragment并传递参数

Bundle bundle =newBundle();

        bundle.putInt(Constants.PRODUCT_ID, productId);

        start(ProductDetailFragment.newInstance(bundle));

ProductDetailFragment接收参数:

publicstaticProductDetailFragmentnewInstance(Bundle args){

ProductDetailFragment fragment =newProductDetailFragment();

        fragment.setArguments(args);

returnfragment;

    }

@Override

publicvoidonCreate(@NullableBundle savedInstanceState){

super.onCreate(savedInstanceState);

        Bundle args = getArguments();

if(args !=null) {

productId = args.getInt(Constants.PRODUCT_ID,0);

        }

    }

@Override

publicViewonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

View view = inflater.inflate(R.layout.fragment_product_detail, container,false);

        getProductList();

returnview;

    }

六、在Activity跳转到另一个Fragment以及跳转到单例Fragment(类似Activity设置了singletask)

Bundleargs = new Bundle();

args.putString(Constants.KEY_WORD,event.getContent());

SearchResultFragmentfragment = findFragment(SearchResultFragment.class);

if(fragment == null) {

fragment=SearchResultFragment.newInstance(args);

}else {

fragment.putNewBundle(args);

}

finalISupportFragment topFragment = getTopFragment();

MyBaseFragmentbaseFragment = (MyBaseFragment) topFragment;

baseFragment.start(fragment,SupportFragment.SINGLETASK);

SearchResultFragment如果已经存在,则会调用如下方法:

/**

    * 类似于 Activity的 onNewIntent()

    */

@Override

publicvoidonNewBundle(Bundle args) {

super.onNewBundle(args);

Stringkeyword = args.getString(Constants.KEY_WORD);

    }

七、跳转到另一个Fragment之后返回获取到数据

FragmentA:

    startForResult(ModifyDetailFragment.newInstance(mTitle), REQ_MODIFY_FRAGMENT);

@Override

publicvoidonFragmentResult(intrequestCode,intresultCode, Bundle data){

super.onFragmentResult(requestCode, resultCode, data);

if(requestCode == REQ_MODIFY_FRAGMENT && resultCode == RESULT_OK && data !=null) {

            mTitle = data.getString(KEY_RESULT_TITLE);

            mToolbar.setTitle(mTitle);

// 保存被改变的 title

            getArguments().putString(ARG_TITLE, mTitle);

            Toast.makeText(_mActivity, R.string.modify_title, Toast.LENGTH_SHORT).show();

        }

    }

ModifyDetailFragment:

Bundle bundle =newBundle();

bundle.putString(DetailFragment.KEY_RESULT_TITLE, mEtModiyTitle.getText().toString());

setFragmentResult(RESULT_OK, bundle);

八、跳转到另一个Fragment并销毁当前Fragment

startWithPop(CycleFragment.newInstance(mNumber +1));

九、如果跳转Fragment时不想隐藏上一个Fragment,使用场景:比如半透明界面,可以这么写

extraTransaction().startDontHideSelf(DetailFragment.newInstance());

十、Fragment当中的返回监听

前面写的是Activity的返回监听,这里还要特别注意下Fragment的,将一个Activity改造成Fragment时很有可能漏掉这一点。在Activity当中,对控件设置的onKeyListener之类的是可以响应的,但在Fragment当中就有可能没响应了,比如我写的这一段:

mAgentWeb.getWebCreator().getWebView().setOnKeyListener(newView.OnKeyListener() {

@Override

publicbooleanonKey(View v,intkeyCode, KeyEvent event){

if(event.getAction() == KeyEvent.ACTION_DOWN) {

if(keyCode == KeyEvent.KEYCODE_BACK && mAgentWeb.getWebCreator().getWebView().canGoBack()) {// 表示按返回键时的操作

mAgentWeb.getWebCreator().getWebView().goBack();// 后退

// webview.goForward();//前进

returntrue;// 已处理

}elseif(keyCode == KeyEvent.KEYCODE_BACK) {

                    pop();

                }

            }

returnfalse;

        }

    });

这里我引用了WebView的第三方框架AgentWeb,对其做返回键监听,结果改造成Fragment之后就没响应了。解决方法是重写onBackPressedSupport()方法:

@Override

publicbooleanonBackPressedSupport(){

        String originalUrl = mAgentWeb.getWebCreator().getWebView().copyBackForwardList().getCurrentItem().getOriginalUrl();

if(mAgentWeb.getWebCreator().getWebView().canGoBack() && !(originalUrl.equals(url))) {

mAgentWeb.getWebCreator().getWebView().goBack();// 后退

}else{

            pop();

        }

returntrue;

    }

十一、其他:fragment当中添加viewpager+fragment时,viewpager的adapter有一个参数需要填入FragmentManager,这个manager一定要填入getChildFragmentManager(),而不是getFragmentManager(),否则会造成fragment重复生成无法被销毁



publicclassAppextendsApplication{

@Override

    public void onCreate() {

super.onCreate();

Fragmentation.builder()

// 设置 栈视图 模式为 (默认)悬浮球模式  SHAKE: 摇一摇唤出  NONE:隐藏, 仅在Debug环境生效

.stackViewMode(Fragmentation.BUBBLE)

.debug(BuildConfig.DEBUG)// 实际场景建议.debug(BuildConfig.DEBUG)

/**

                * 可以获取到{@link me.yokeyword.fragmentation.exception.AfterSaveStateTransactionWarning}

                * 在遇到After onSaveInstanceState时,不会抛出异常,会回调到下面的ExceptionHandler

                */

.handleException(newExceptionHandler() {

@Override

public void onException(Exceptione) {

// 以Bugtags为例子: 把捕获到的 Exception 传到 Bugtags 后台。

// Bugtags.sendException(e);

                    }

                })

                .install();

    }

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

推荐阅读更多精彩内容