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

南笙酒味 提交于 2019-12-03 15:46:02

Fragment相信大家并不陌生了,3.0后出来的碎片。但是听得多不代表用得也多,尤其用fragment替代activity的使用。

如果大家想对Fragment有一个详细的了解可以阅读这篇文章Android Fragment完全解析,关于碎片你所需知道的一切

 

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

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

 

我们先看看BaseFragment,里面封装了一个接口,一个方法,用来处理fragment之前的通信

 

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

 

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

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

 

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

 

,然后,我们再来看一个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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!