# FragmentUtil **Repository Path**: fzhengx/FragmentUtil ## Basic Information - **Project Name**: FragmentUtil - **Description**: fragment显示和跳转管理工具 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-07-24 - **Last Updated**: 2023-06-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FragmentUtil #### 介绍 Fragment管理工具,包括显示隐藏单个或多个fragment;Fragment的显示或隐藏状态监听;Fragment返回键处理。简化多Fragment和Fragment嵌套等情况下的操作流程。仅用于support包中的Fragment。 #### 安装教程 1. ``` allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` 2. xxxx 3. xxxx #### 使用说明 1. 首先,在Activity的布局文件中定义一个承载Fragment的容器 本工具定义了一个FragContainer类(继承自Fragment类)作为fragment的容器, eg: ``` ``` 2. Activity中 通过FragmentUtil.findController()方法得到一个FragController实例,用它来实现fragment的显示隐藏等操作; ``` controller = FragmentUtil .findController(this); ``` 注:改方法要在视图设置以后才能使用,如Activity的setContentView以后,Fragment的onCreateView加载了view以后; 如何保证得到一个合适的FragController? 实际上FragController是与FragContainer绑定的,findController方法会先从传入的Activity或fragment对应的FragmentManager开始查找,当前层级如果有对应的FragContainer,则返回与其绑定的FragController;否则,向上查找,直到没有parent为止。 1.findController(@NonNull FragmentActivity fragmentActivity):查找Activity下的FragController。 2.findController(@NonNull FragmentActivity fragmentActivity, int containerId): 用于同一个页面有多个fragment容器的情况。 3。findController(@NonNull Fragment fragment):适用于fragment中嵌套fragment的情况; 4、findController(@NonNull Fragment fragment, int containerId):适用于fragment中嵌套多个fragment容器的情况; 3. FragController 一个FragController对应了一个FragmentManager,所有功能实现都是基于FragmentManager的。 1.getTopFragment:获取当前显示的fragment; 2.findFragment:传入fragment的class对象,根据类名查找是否已经存在相应的fragment(这里可能会有同一个类添加多次的情况,所以加了一个tag后缀参数)。 3.initSingleFragment:初始化单个fragment; 4.initMultiFragments:初始化多个fragment(多个fragment可能由同一个类创建,这里也有一个额外的tag后缀参数,与findFragment对应)。 5.show().hide():显示隐藏fragment(如果还没有add会报错); 6.start():启动一个新的fragment,操作压入回退栈; 7.startWithPop(): 启动一个新的fragment,类似Activity中启动新的界面并结束当前界面; 8.replace()和replaceWithPop() 方法表示在切换fragment时用的replace的方式。 9.pop():出栈操作,类似Activity finish(); 4. 如果要实现是否可见的状态监听和拦截返回键事件,要实现以下两个接口 Fragment需要实现IFragmentVisibleHandler(可见不可见状态监听)和IFragmentBackHandler(处理返回键事件)接口; 参考BaseQuickFragment类中的实现或者直接继承BaseQuickFragment类; 以下代码不能缺少: ``` ... private FragmentHandlerDelegate fragmentHandlerDelegate = FragmentUtil.setupDelegate(this); ... @Override public void onResume() { super.onResume(); fragmentHandlerDelegate.onResume(); } @Override public void onPause() { super.onPause(); fragmentHandlerDelegate.onPause(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); fragmentHandlerDelegate.setUserVisibleHint(isVisibleToUser); } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); fragmentHandlerDelegate.onHiddenChanged(hidden); } ... ``` 返回键事件拦截可以采用如下方式: ``` public boolean onInterceptBackPressed() { return false; } @Override public boolean onBackPressed() { return onInterceptBackPressed() || FragmentUtil.handleFragmentsBackPressed(this); } ``` 必须在Activity中书写以下代码: ``` @Override public void onBackPressed() { if (!FragmentUtil.handleFragmentsBackPressed(this)) { super.onBackPressed(); } } ```