Fragment实战使用之—— 一个activity管理多个fragment

Fragment相信你们并不陌生了,3.0后出来的碎片。可是听得多不表明用得也多,尤为用fragment替代activity的使用。 java

若是你们想对Fragment有一个详细的了解能够阅读这篇文章Android Fragment彻底解析,关于碎片你所需知道的一切ide

 

我这里写了个Demo,体验一个activity管理多个fragment.(多说一句,必定要记得导入v4包,用v4里面的Fragment) this

一个Activity,五个Fragment,其中BackHandledFragment是用来管理返回键处理的.其实还有一个BaseFragment,BackHandledFragmentent继承BaseFragment。而后FragmentA,FragmentB,FragmentC,FragmentD都继承BackHandledFragment。 spa

 

咱们先看看BaseFragment,里面封装了一个接口,一个方法,用来处理fragment以前的通讯 .net

 

而后咱们看看MainActivity,要先实现一个接口,就是BaseFragment里面的OnFragmentInteractionListener code

 

不要问我为何连这个xml文件都贴上来,确定对部分同志有帮助。  orm

,实现其方法,在里面处理fragment的路径切换(我这里经过字符串来处理切换不一样的fragment,) xml

 

继续看addFragmentContent();这个方法,经过FragmentManger来管理fragment blog

 

,而后,咱们再来看一个FragmentA里面 继承

界面就一个button,点击后跳转到FragmentB。因此咱们监听这个button的点击事件,而后处理FragmetnA到FragmentB。

 public void onButtonPressed(String uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

 

其实就是MaintActivity这里

 @Override
    public void onFragmentInteraction(String uri) {

        String intent = uri.toString();
        if (ATOB.equals(intent)) {
            addFragmentContent(FragmentB.newInstance("", ""));
        } else if (BTOC.equals(intent)) {
            addFragmentContent(FragmentC.newInstance("", ""));
        } else if (CTOD.equals(intent)) {
            addFragmentContent(FragmentD.newInstance("", ""));
        } else if (DTOA.equals(intent)) {
            addFragmentContent(FragmentA.newInstance("", ""));
        }
    }

。这样就实现了FragmentA切换到FragmentB。切换最关键的地方就是

 

private void addFragmentContent(Fragment paramFragment) {

        this.mFragmentManager = getSupportFragmentManager();

        FragmentTransaction localFragmentTransaction = this.mFragmentManager.beginTransaction();

        localFragmentTransaction.replace(R.id.fragment_container, paramFragment);
        //记录commit一次操做,与mFragmentManager.popBackStack();匹配使用
        localFragmentTransaction.addToBackStack(null);
        //commitAllowingStateLoss 优于 commit 方法,当使用commit方法时,系统将进行状态判断,若是状态(mStateSaved)已经保存,将发生"Can not perform this action after onSaveInstanceState"错误。
        //若是mNoTransactionsBecause已经存在,将发生"Can not perform this action inside of " + mNoTransactionsBecause错误。
        localFragmentTransaction.commitAllowingStateLoss();
    }



。你们体验一下就行了。

而后关于fragment返回键的处理。 我是参考这篇文章处理的,效果不错(优雅的让Fragment监听返回键)

而后在MainActivity里面实现这个接口BackHandledInterface

并实现其方法。

 

在onBackPressed()这个里面,真正的返回上一个fragment是mFragmentManager.popBackStack();

 

这里必定要注意,要想让其能够返回,必定得在commit前加上localFragmentTransaction.addToBackStack(null);

localFragmentTransaction.addToBackStack(null);与mFragmentManager.popBackStack(); 是匹配使用的.

 这里是统一处理每一个fragment的回返键,若是某个fragment想单独处理,点击后不是返回上一个fragment,能够在fragment里的onBackPressed()实现

 

 

昨天忘记补上源码,今天补上,java文件跟xml文件。连接: http://pan.baidu.com/s/1qWx99oC 密码: mbab

相关文章
相关标签/搜索