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
相关推荐
4Forsee几秒前
【增强现实】快速上手 Vuforia Unity Android AR 应用开发
android·unity·ar
仰泳之鹅2 分钟前
【杂谈】C语言中的链接属性、声明周期以及static关键字
java·c语言·前端
沐知全栈开发3 分钟前
SVG 文本:深入解析与高效应用
开发语言
weixin_531651814 分钟前
Java 正则表达式
java·正则表达式
空空kkk5 分钟前
Spring Boot项目的搭建
java·spring boot·后端
2501_940315266 分钟前
【无标题】(leetcode933)最近的请求次数
java·前端·javascript
张丶大帅8 分钟前
【走进Golang】
开发语言·后端·golang
Sheep Shaun9 分钟前
深入理解红黑树:从概念到完整C++实现详解
java·开发语言·数据结构·c++·b树·算法
每天学习一丢丢10 分钟前
Spring Boot 调用泛微 E9 Token 认证 + 创建流程完整教程
java·spring boot·后端
楼田莉子11 分钟前
CMake学习:入门及其下载配置
开发语言·c++·vscode·后端·学习