Android,activity+多个fragment页面切换逻辑

在Android app开发中,常用一个activity+多个fragment的UI结构,fragment之间有层级关系。fragment的显示与调度需要用到activity的fragmentManager,并且要封装一些方法共ui层调用。但是如果在activity里面直接写,会显得activity代码臃肿,那么需要封装一个辅助类

例如 AppPageHelper

java 复制代码
public class DemoPageHelper {
    private FragmentManager mFragmentManager;
    private boolean mIsAtXxxPage;

    private static final class DemoPageHelperInstanceHolder {
        private static final DemoPageHelper INSTANCE = new DemoPageHelper();
    }

    public static DemoPageHelper getInstance() {
        return DemoPageHelperInstanceHolder.INSTANCE;
    }

    private DemoPageHelper() {
        // 构造私有化
    }

    // 初始化这个辅助类,注入Activity的fragmentManager
    public void init(FragmentManager fragmentManager) {
        mFragmentManager = fragmentManager;
    }

    // 释放fragmentManager,避免页面销毁后内存泄露
    public void release() {
        mFragmentManager = null;
    }

    // 显示1级页面,加到activity容器中,但不加到fragment返回栈
    // 不加到返回栈中,fragmentManager的popBackStack不影响该页面;
    // 对于Activity的onBackPressed(),如果在返回栈中的页面调用,则效果同popBackStack;如果未入栈的1级页面在前台显示时调用,则页面和activity一起退出
    public void showLevel1(Fragment fragment, String tag) {
        if (mFragmentManager.getBackStackEntryCount() > 0) {
            // 清空返回栈,露出没入栈的rootFragment
            mFragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }
        Fragment rootFragment = mFragmentManager.findFragmentByTag(tag);
        if (rootFragment == null) {
            mFragmentManager.beginTransaction().add(R.id.container, fragment, tag).commit();
        }
        //mFragmentManager.executePendingTransactions();
    }

    // 显示2、3...级页面,需要加到fragment返回栈
    public void showLevel2(Fragment newFragment, String tag) {
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
        Fragment topFragment = getStackTopFragment();
        transaction.hide(topFragment).add(R.id.container, newFragment, tag).addToBackStack(tag).commit();
        //mFragmentManager.executePendingTransactions();
    }

    private Fragment getStackTopFragment() {
        int backStackPageCount = mFragmentManager.getBackStackEntryCount();
        String fragmentTag;
        if (backStackPageCount == 0) {
            fragmentTag = RootFragment.class.getSimpleName();
        } else {
            fragmentTag = mFragmentManager.getBackStackEntryAt(backStackPageCount - 1).getName();
        }
        return mFragmentManager.findFragmentByTag(fragmentTag);
    }

    public void back() {
        // 作用于返回栈,弹出栈顶,显示栈内上一级页面;如果当前是栈内第一个页面则清空返回栈;如果已清空栈,则无效果。
        mFragmentManager.popBackStack();
    }

    // Xxx页面是否正在前台显示
    public boolean isAtXxxPage() {
        return mIsAtXxxPage;
    }

    public void setAtXxxPage(boolean atXxxPage) {
        mIsAtXxxPage = atXxxPage;
    }
}

Activity中使用

java 复制代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        DemoPageHelper.getInstance().init(getSupportFragmentManager());
        DemoPageHelper.getInstance().showLevel1(new RootFragment(), RootFragment.class.getSimpleName());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        DemoPageHelper.getInstance().release();
    }

fragment中使用

java 复制代码
    @Override
    public void onStart() {
        super.onStart();
        DemoPageHelper.getInstance().setAtXxxPage(true);
    }

    @Override
    public void onStop() {
        super.onStop();
        DemoPageHelper.getInstance().setAtXxxPage(false);
    }

    // 在非1级页面,返回到上一级
    DemoPageHelper.getInstance().back();

    // 显示非一级页面
    DemoPageHelper.getInstance().showLevel2(new TwoFragment(), TwoFragment.class.getSimpleName());

    // 在1级页面退出app,直接finish activity
相关推荐
夏幻灵11 分钟前
JAVA基础:基本数据类型和引用数据类型
java·开发语言
weixin1997010801617 分钟前
闲鱼 item_get - 商品详情接口对接全攻略:从入门到精通
java·后端·spring
cike_y30 分钟前
Spring-Bean的作用域&Bean的自动装配
java·开发语言·数据库·spring
qq_12498707531 小时前
基于深度学习的蘑菇种类识别系统的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·深度学习·cnn·cnn算法
十八度的天空1 小时前
第01节 Python的基础语法
开发语言·python
谈笑也风生1 小时前
经典算法题型之排序算法(三)
java·算法·排序算法
夏沫琅琊1 小时前
Android 各类日志全面解析(含特点、分析方法、实战案例)
android
yue0081 小时前
C# 字符串倒序
开发语言·c#
自己的九又四分之三站台1 小时前
导入数据到OG GraphQL以及创建graph
java·后端·graphql
强子感冒了2 小时前
Java学习笔记:String、StringBuilder与StringBuffer
java·开发语言·笔记·学习