<commit_before># Fragmentation
A powerful library that manage Fragment for Android!

为"单Activity ＋ 多Fragment的架构","多模块Activity + 多Fragment的架构"而生，帮你简化使用过程，修复了官方Fragment库存在的一些BUG。


相关阅读：
[Fragment全解析系列（一）：那些年踩过的坑](http://www.jianshu.com/p/d9143a92ad94)    ， 
[Fragment全解析系列（二）：正确的使用姿势](http://www.jianshu.com/p/fd71d65f0ec6)

# Demo演示：
单Activity + 多Fragment

<img src="/gif/demo.gif"/>

# 特性
1、**为重度使用Fragment而生**

2、**提供了方便的管理Fragment的方法**

3、**有效解决Fragment重叠问题**

4、**实时查看Fragment的(包括嵌套Fragment)栈视图，方便Fragment嵌套时的调试**

5、**增加启动模式、startForResult等类似Activity方法**

6、**修复官方库里pop(tag/id)出栈多个Fragment时的一些BUG**

7、**完美解决进出栈动画的一些BUG，更自由的管理Fragment的动画**
# 如何使用
1、项目下app的build.gradle中依赖：
````gradle
compile 'me.yokeyword:fragmentation:0.4.0'
// appcompat v7包也是必须的
````
2、Activity继承SupportActivity：
````java
public class MainActivity extends SupportActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(...);
        if (savedInstanceState == null) {
            start(HomeFragment.newInstance());
        }
    }

    /**
    *  设置Container的id，必须实现
    */
    @Override
    public int setContainerId() {
        return R.id.fl_container;
    }

    /**
     *  设置全局动画，在SupportFragment可以自由更改其动画
     */
    @Override
    protected FragmentAnimator onCreateFragmentAnimator() {
        // 默认竖向(和安卓5.0以上的动画相同)
        return super.onCreateFragmentAnimator();
        // 设置横向(和安卓4.x动画相同)
        // return new DefaultHorizontalAnimator();
        // 设置自定义动画
        // return new FragmentAnimator(enter,exit,popEnter,popExit);
    }
````
3、Fragment继承SupportFragment

# API

**SupportActivity**
打开 **栈视图** 的提示框，在开发时，有复杂嵌套的场景下，可以通过下面的方法查看不同阶级的栈视图。
````java
// 弹出 栈视图 提示框
showFragmentStackHierarchyView();
````
除此之外包含大部分SupportFragment的方法，请自行查看。

**SupportFragment**

1、启动相关：
````java
// 启动新的Fragment
start(SupportFragment fragment)
// 以某种启动模式，启动新的Fragment
start(SupportFragment fragment, int launchMode)
// 启动新的Fragment，并能接收到新Fragment的数据返回
startForResult(SupportFragment fragment,int requestCode)
// 启动目标Fragment，并关闭当前Fragment
startWithFinish(SupportFragment fragment)
````


2、关闭Fragment：
````java
// 关闭当前Fragment
pop();

// 关闭某一个Fragment栈内之上的Fragments
popTo(Class fragmentClass, boolean includeSelf);

// 如果想出栈后，紧接着开始.beginTransaction()开始一个事务，请使用下面的方法：
// 在 第二篇 文章内的 Fragment事务部分的问题 有解释原因
popTo(Class fragmentClass, boolean includeSelf, Runnable afterTransaction)
````
3、在SupportFragment内，支持监听返回按钮事件：
````java
@Override
public boolean onBackPressedSupport() {
   // 返回false,则继续传递返回事件； 返回true则不继续传递
    return false;
}
````

4、 定义当前Fragment的动画，复写`onCreateFragmentAnimation`方法：
````java
@Override
protected FragmentAnimator onCreateFragmentAnimation() {
    // 获取在SupportActivity里设置的全局动画对象
    FragmentAnimator fragmentAnimator = _mActivity.getFragmentAnimator();
    fragmentAnimator.setEnter(0);
    fragmentAnimator.setExit(0);
    return fragmentAnimator;

    // 也可以直接通过
    // return new FragmentAnimator(enter,exit,popEnter,popExit)设置一个全新的动画
}
````
5、获取当前Activity/Fragment内栈顶(子)Fragment：
````java
getTopFragment();
````

6、获取栈内某个Fragment对象：
````java
findFragment(Class fragmentClass);

// 获取某个子Fragment对象
findChildFragment(Class fragmentClass);
````

**更多**
隐藏/显示 输入法:
````java
// 隐藏软键盘 一般用在onHiden里
hideSoftInput();
// 显示软键盘
showSoftInput(View view);
````
下面是DetailFragment  `startForResult`  ModifyTitleFragment的代码：
````java
DetailFragment.class里:
<commit_msg>update to 0.4.0<commit_after># Fragmentation
A powerful library that manage Fragment for Android!

为"单Activity ＋ 多Fragment的架构","多模块Activity + 多Fragment的架构"而生，帮你简化使用过程，修复了官方Fragment库存在的一些BUG。


相关阅读：
[Fragment全解析系列（一）：那些年踩过的坑](http://www.jianshu.com/p/d9143a92ad94)    ， 
[Fragment全解析系列（二）：正确的使用姿势](http://www.jianshu.com/p/fd71d65f0ec6)

# Demo演示：
单Activity + 多Fragment

<img src="/gif/demo.gif"/>

# 特性
1、**为重度使用Fragment而生**

2、**提供了方便的管理Fragment的方法**

3、**有效解决Fragment重叠问题**

4、**实时查看Fragment的(包括嵌套Fragment)栈视图，方便Fragment嵌套时的调试**

5、**增加启动模式、startForResult等类似Activity方法**

6、**修复官方库里pop(tag/id)出栈多个Fragment时的一些BUG**

7、**完美解决进出栈动画的一些BUG，更自由的管理Fragment的动画**
# 如何使用
1、项目下app的build.gradle中依赖：
````gradle
compile 'me.yokeyword:fragmentation:0.4.0'
// appcompat v7包也是必须的
````
2、Activity继承SupportActivity：
````java
public class MainActivity extends SupportActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(...);
        if (savedInstanceState == null) {
            start(HomeFragment.newInstance());
        }
    }

    /**
    *  设置Container的id，必须实现
    */
    @Override
    public int setContainerId() {
        return R.id.fl_container;
    }

    /**
     *  设置全局动画，在SupportFragment可以自由更改其动画
     */
    @Override
    protected FragmentAnimator onCreateFragmentAnimator() {
        // 默认竖向(和安卓5.0以上的动画相同)
        return super.onCreateFragmentAnimator();
        // 设置横向(和安卓4.x动画相同)
        // return new DefaultHorizontalAnimator();
        // 设置自定义动画
        // return new FragmentAnimator(enter,exit,popEnter,popExit);
    }
````
3、Fragment继承SupportFragment

# API

**SupportActivity**
打开 **栈视图** 的提示框，在开发时，有复杂嵌套的场景下，可以通过下面的方法查看不同阶级的栈视图。
````java
// 弹出 栈视图 提示框
showFragmentStackHierarchyView();
````
除此之外包含大部分SupportFragment的方法，请自行查看。

**SupportFragment**

1、启动相关：
````java
// 启动新的Fragment
start(SupportFragment fragment)
// 以某种启动模式，启动新的Fragment
start(SupportFragment fragment, int launchMode)
// 启动新的Fragment，并能接收到新Fragment的数据返回
startForResult(SupportFragment fragment,int requestCode)
// 启动目标Fragment，并关闭当前Fragment
startWithFinish(SupportFragment fragment)
````


2、关闭Fragment：
````java
// 关闭当前Fragment
pop();

// 关闭某一个Fragment栈内之上的Fragments
popTo(Class fragmentClass, boolean includeSelf);

// 如果想出栈后，紧接着开始.beginTransaction()开始一个事务，请使用下面的方法：
// 在 第二篇 文章内的 Fragment事务部分的问题 有解释原因
popTo(Class fragmentClass, boolean includeSelf, Runnable afterTransaction)
````
3、在SupportFragment内，支持监听返回按钮事件：
````java
@Override
public boolean onBackPressedSupport() {
   // 返回false,则继续传递返回事件； 返回true则不继续传递
    return false;
}
````

4、 定义当前Fragment的动画，复写`onCreateFragmentAnimation`方法：
````java
@Override
protected FragmentAnimator onCreateFragmentAnimation() {
    // 获取在SupportActivity里设置的全局动画对象
    FragmentAnimator fragmentAnimator = _mActivity.getFragmentAnimator();
    fragmentAnimator.setEnter(R.anim.enter);
    fragmentAnimator.setExit(R.anim.exit);
    return fragmentAnimator;

    // 也可以直接通过
    // return new FragmentAnimator(enter,exit,popEnter,popExit)设置一个全新的动画
}
````
5、获取当前Activity/Fragment内栈顶(子)Fragment：
````java
getTopFragment();
````

6、获取栈内某个Fragment对象：
````java
findFragment(Class fragmentClass);

// 获取某个子Fragment对象
findChildFragment(Class fragmentClass);
````

**更多**
隐藏/显示 输入法:
````java
// 隐藏软键盘 一般用在onHiden里
hideSoftInput();
// 显示软键盘
showSoftInput(View view);
````
下面是DetailFragment  `startForResult`  ModifyTitleFragment的代码：
````java
DetailFragment.class里:

{'fraction_non_alphanumeric': 0.1297500361219477, 'fraction_numerical': 0.011414535471752637, 'mean_word_length': 5.109443954104148, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '547482', 'n_tokens_mistral': 3168, 'n_tokens_neox': 3246, 'n_words': 366}