FragmentManager

Introduction: Fragment 切换方法的封装
More: Author   ReportBugs   
Tags:

Fragment 切换方法的封装

  1. 提供多栈管理(官方的 fragment 是单栈的)
  2. 简化 Fragment 的管理
  3. 完全模仿 Activity 的接口方法和回调(如 startFragment()、finish()等)
  4. 通过 Intent 启动,通过 onFragmentResult()方法回调
  5. 使用 Rx 的方式启动 Fragment: startFragmentForObservable(Intent intent)
  6. 自定义 Fragment 切换动画
  7. (2.4.0 NEW)加入侧滑返回

3.x 版本全新来袭

3.x 版本使用函数式架构完全重构,带来更加优美的新特性

  1. Kotlin 实现
  2. 全面升级为 RxJava2
  3. 函数式架构,分离副作用,参考 Haskell IO 设计和 Redux 架构
  4. 全新的队列处理方式,并具有异常回退功能,全面提供线程安全的运行方式
  5. 全新状态管理方式,带来状态序列化、状态重现等高级特性
  6. 部分实现使用面向组合子设计,灵活清晰

注意:3.x 版本目前还属于初期开发阶段,很多以前的特性还没有实现,功能和稳定性上更推荐 2.x 版本(最新为 2.7.0),但后续会持续更新并更多维护 3.x 版本了,接口会尽量保持和老版本相同

现在 3.x 版本只实现了 Fragment 普通方式启动、ResultData 回调、BackPress 处理功能、Rx 启动方式,其他如侧滑返回、新 Activity 启动 Fragment 等高级功能将在后续更新中实现,敬请期待

添加到 Android studio

Step1: 在根 build.gradle 中添加仓库:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

Step2: 在工程中添加依赖:

dependencies {
    // 2.x
    compile 'com.github.Yumenokanata:FragmentManager:2.7.0'
    // 3.x
    compile 'com.github.Yumenokanata:FragmentManager:3.0-RC1'
    // SNAPSHOT
    compile 'com.github.Yumenokanata:FragmentManager:master-SNAPSHOT'
}

使用方法

1、 使用的 Activity 和 Fragment 分别应继承自 BaseFragmentManagerActivity 和 BaseManagerFragment

public class MyActivity extends BaseFragmentManagerActivity
public class MyFragment extends BaseManagerFragment

2、在 Activity 中需要实现两个方法:

public class MyActivity extends BaseFragmentManagerActivity {
    //此方法中需返回 fragment 显示在的 View 的 id
    public int fragmentViewId() { ... }
    //此方法中需要返回多栈的栈名以及所对应的默认 Fragment
    public Map<String, Class<?>> baseFragmentWithTag() { ... }
}

注:之后可以通过 switchToStackByTag(String tag)方法在不同的栈直接进行切换

3、Fragment 中不必要实现任何方法

4、Fragment 中的使用

startFragment(Intent)  //通过 Intent 启动一个 Fragment
onFragmentResult(Intent) //通过 Intent 启动一个 Fragment,并在这个新 Fragment 结束后回调 onFragmentResult 方法
finish() //结束当前的 Fragment
startFragmentOnNewActivity(Intent intent, Class<? extends SingleBaseActivity> activityClazz) //在新 Activity 中启动 Fragment

startFragmentForObservable(Intent intent) // 使用 Rxjava 的方式启动新的 Fragment
startActivityForObservable(Intent intent) // 使用 Rxjava 的方式启动新的 Activity
//Rx 方式返回的是 Observable<Tuple<Integer, Bundle>>, 分别对应 resultCode 和 bundle(此种启动方式时,requestCode 会由框架自己生成和管理,所以不能直接传入和获取到)

onFragmentResult(int requestCode, int resultCode, Bundle data) //回调方法

5、Activity 中的使用

switchToStackByTag(String tag)  //切换栈

6、自定义 Fragment 进入和退出动画

BaseFragmentManagerActivity.setFragmentAnim(int enterAnim, int exitAnim)

7、(2.4.0 修改了 onShow()回调方法) 新增两个生命周期方法:onShow()和 onHide()
onHide 方法只会在 Fragment 由显示状态切换为隐藏状态时调用,这意味着 Fragment 被销毁时不会回调此方法。
对于 startFragmentOnNewActivity()这两个生命周期方法同样有效。

(2.4.0 以下版本)onShow 方法只会在 Fragment 由隐藏状态转换为显示状态时被调用,并且是在界面切换动画完成后调用(这意味着 onShow 可能在 onCreateView 方法调用完成后一段时间后才会调用);

(Test) onHide()方法有了一个参数:@OnHideMode int hideMode, 有三种可能的值:

  1. OnHideMode.ON_PAUSE: 1. 启动了一个新 Activity(无论是原生方法还是本框架的方法) 2. 程序被切换到后台(当且仅当该 Fragment 所在 Activity 在最前时)
  2. OnHideMode.ON_START_NEW: 当启动一个新的 Fragment 前(即 onHide 会在新 Fragment 的 onShow 方法之前调用)
  3. OnHideMode.ON_SWITCH: 在切换到另一个 Tag 导致自己被隐藏时回调

(2.4.0 及以上版本)onShow()方法有了一个参数:@OnShowMode int callMode, 有四种可能的值:

  1. OnShowMode.ON_CREATE: 在 Fragment 创建时回调并传入
  2. OnShowMode.ON_RESUME: 实现是在原生的 onResumeFragments 方法中回调,有两种情况会被回调:1) 通过各种 startActivity 方法启动一个 Activity 后返回的 2) 应用从后台返回时
  3. OnShowMode.ON_BACK: 在从启动的下一个 Fragment 返回时回调(注意,从下一个 Activity 中返回时并不会回调 onBack)
  4. OnShowMode.ON_SWITCH: 在通过 switchToStackByTag()方法切换栈时,对切换到的栈的可见 Fragment(即最上层的)回调

8、(2.4.0 NEW)新增侧滑返回 通过 SwipeBackUtil 中的静态方法对 Activity 或者 Fragment 添加侧滑返回的功能

对 Fragment:
在 BaseManagerFragment 的 onCreateView()方法中添加

return SwipeBackUtil.enableSwipeBackAtFragment(this, view);

eg:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_blank_fragment12, container, false);
    return SwipeBackUtil.enableSwipeBackAtFragment(this, view);
}

对 Activity:
在 BaseFragmentManagerActivity 的 onPostCreate()方法中添加:

SwipeBackUtil.enableSwipeBackAtActivity(this);

建议用于 SingleBaseActivity

eg:

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    SwipeBackUtil.enableSwipeBackAtActivity(this);
}

9、(TEST)抖动抑制 使用方法:
在任意地方调用静态方法:

ThrottleUtil.setThrottleTime(1000);

单位为 ms(也有其他重载方法)

作用为,当设置的时间不为 0 时,凡是通过本框架内的方法启动的界面都会进行抖动抑制,即只会触发设置的时间段内的第一个界面启动事件,类似 Rxjava 的 throttleFirst()方法

License

Copyright 2015 Yumenokanata

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea