项目中遇到了这个问题,在网上找了一下,发现都是一些实现接口啊,或者把实例传出之类的方案.也能解决,有的需要特意指定是哪个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>

4 :下面是a1  继续重写父类 BaseFragment 的onBackPressed()

@Override
public boolean onBackPressed() {
    BaseFragment fragment = (BaseFragment) getChildFragmentManager().findFragmentById(R.id.fragment_content);
    if(fragment != null){
        return fragment.onBackPressed();
    }
    return super.onBackPressed();
}

打开a2代码 ( R.id.fragment_content //这个意思同上 )

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.... 也是这样返回的. 欢迎各位指正.


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐