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) {
其实就是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