上一个项目需要在Fragment里切换和回滚Fragment,而Fragment自己又不能销毁掉自己,
FragmentManager和FragmentTransaction也不能在Fragment类中实例化,在Activity里写接口又太麻烦了,索性写了个工具类。
源码如下:
package com.dubhe.broken.fragmenthelper;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
/**
* 作者:DubheBroken
* 时间:2018/11/19
* 地址:github.com/DubheBroken/FragmentHelper
* 说明:Fragment管理工具类
*/
public class FragmentHelper {
private static FragmentManager fragmentManager;
private static FragmentTransaction fragmentTransaction;
private static FragmentManager getFragmentManager() {
return fragmentManager;
}
private static void setFragmentManager(FragmentManager fragmentManager) {
FragmentHelper.fragmentManager = fragmentManager;
}
public static FragmentTransaction getFragmentTransaction() {
return fragmentTransaction;
}
public static void setFragmentTransaction(FragmentTransaction fragmentTransaction) {
FragmentHelper.fragmentTransaction = fragmentTransaction;
}
private static void initFragmentTransaction() {
fragmentTransaction = fragmentManager.beginTransaction();
}
/**
* 此方法在onBackPressed被重写时使用
* 回退到上一层fragment
* 如果已经是最后一层,隐藏界面
* @param activity 当前activity,仅支持AppCompatActivity
* 在fragment中请使用(AppCompatActivity)getActivity()作为参数传入
*/
public static void back(AppCompatActivity activity) {
if (getFragmentManager().getBackStackEntryCount() <= 1) {
activity.moveTaskToBack(true);
}else{
fragmentManager.popBackStack();
}
}
/**
* 切换Fragment为传入参数
*
* @param activity 当前activity,仅支持AppCompatActivity
* 在fragment中请使用(AppCompatActivity)getActivity()作为参数传入
* @param fragment 目标fragment对象
*/
public static void switchFragment(Fragment fragment, AppCompatActivity activity) {
FragmentHelper.setFragmentManager(activity.getSupportFragmentManager());
FragmentHelper.initFragmentTransaction();
//frame容器id
fragmentManager.findFragmentById(R.id.frame_main);
fragmentTransaction
.replace(R.id.frame_main, fragment)
.addToBackStack(null)
.commit();//替换成下面那句可以在frameLayout容器被遮挡的情况下替换fragment
// .commitAllowingStateLoss();
}
}
首先在你的项目中准备一个FrameLayout控件作为Fragment的容器,再把上述源码写成一个类放到你的项目里,然后把第64行和66行的frame_main换成你的FrameLayout的ID。
切换Frgament
炒鸡简单,就一行代码:(第一个参数是要切换到的Fragment对象)
FragmentHelper.switchFragment(new Fragment2(), this);
回退Fragment
直接按返回键即可,按钮想实现回退可以直接往返回键上面映射。
如果你重写了返回键,可以用这行代码来进行回退操作:
在Activity中
FragmentHelper.back(this);
在Fragment中
FragmentHelper.back((AppCompatActivity) getActivity());
(此处主Acitiviy是AppCompatActivity,支持FragmentActivity,但是这个类太老了不推荐。如果一定要FragmentActivity,把源码FragmentHelper.java中的AppCompatActivity换成FragmentActivity,然后去掉强转即可)
获取FragmentManager和FragmentTransaction的实例
直接get即可
FragmentManager fm = FragmentHelper.getFragmentManager();
FragmentTransaction ft = FragmentHelper.getFragmentTransaction();