【Android】Fragment管理工具类

上一个项目需要在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();

 

你可能感兴趣的:(Andoird,Java)