多层Fragment 返回上一级Fragment 解决方案
项目中遇到了这个问题,在网上找了一下,发现都是一些实现接口啊,或者把实例传出之类的方案.也能解决,有的需要特意指定是哪个Fragment,但是在我现在的项目中却满足不了.故自己弄了一套适用于现在项目的方案出来,各位可以看一下,说不定,你想要的方案,就在这里.我这边的情况是这样的, 一个Activity 管理了 4个Fragment, A,B,C,D A是作为容器, 默认显
项目中遇到了这个问题,在网上找了一下,发现都是一些实现接口啊,或者把实例传出之类的方案.也能解决,有的需要特意指定是哪个Fragment,但是在我现在的项目中却满足不了.
故自己弄了一套适用于现在项目的方案出来,各位可以看一下,说不定,你想要的方案,就在这里.
我这边的情况是这样的,
一个Activity 管理了 4个Fragment, A,B,C,D
A是作为容器, 默认显示 (Fragment)a1, 点击a1中某项,
又跳转到(Fragment)a2 , 点击a2又继续向下跳转,..........
总之到最后无论是按物理返回键,还是左上角自己定义的返回,都要一层一层的向上返回,
但是只返回到 a1 ,再按返回键,就要退出程序到桌面了.
原本所有的Fragment 都继承了自己写的一个BaseFragment 这样就更好管理了.
1:首先是Activity 重写 OnBackPressed()
取得当前ViewPage当前页,获取当前页实例,判断Fragment的 onBackPressed 返回的是否为true,
如果为true 直接返回,不处理,
@Override public void onBackPressed() { int current = mBinding.viewPager.getCurrentItem(); BaseFragment fragment = (BaseFragment) mAdapter.getItem(current); if(fragment != null && fragment.onBackPressed()){ return; } super.onBackPressed(); }
2:接下来是BaseFragment 添加一个函数 onBackPressed() 返回类型为boolean,默认返回false
public boolean onBackPressed() { return false; }
3:在容器A中,默认显示a1,然后重写父类 BaseFragment 的onBackPressed()
public void setupViews(){ FragmentTransaction ft = getChildFragmentManager().beginTransaction(); a1 a1Fragment= new a1(); ft.add(R.id.fragment_content, a1); ft.commitAllowingStateLoss(); }
@Override public boolean onBackPressed() { BaseFragment fragment = (BaseFragment) getChildFragmentManager().findFragmentById(R.id.fragment_content); if(fragment != null){ return fragment.onBackPressed(); } return super.onBackPressed(); }
容器A的布局
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="info" type="String" /> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <FrameLayout android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> </layout>
@Override public boolean onBackPressed() { BaseFragment fragment = (BaseFragment) getChildFragmentManager().findFragmentById(R.id.fragment_content); if(fragment != null){ return fragment.onBackPressed(); } return super.onBackPressed(); }
FragmentTransaction ft = getFragmentManager().beginTransaction(); a2 a2Fragment= new a2(); ft.add(R.id.fragment_content, a2Fragment); ft.addToBackStack(null); ft.commitAllowingStateLoss();
5:下面是a2的代码处理还是老样子,重写 BaseFragment 的onBackPressed()
@Override public boolean onBackPressed() { getFragmentManager().popBackStack(); return true; }
到这里,就能正常的返回啦. 如果下面还有a3,a4,a5.... 也是这样返回的. 欢迎各位指正.
更多推荐
所有评论(0)