Fragmentation

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zsp_android_com/article/details/86592026

Fragmentation

API

核心概括

  • loadRootX()系列操作对象是孩子Fragment。为避被强杀重启后重复load,建于findChildFragment(ChildFragment.class)==null时load;
  • startX()popX()find/getX()系列操作对象是兄弟Fragment;
  • popChildX()find/getChildX()系列操作对象是孩子Fragment。

Application初始化API

package application;

import android.support.annotation.NonNull;

import me.yokeyword.fragmentation.Fragmentation;
import me.yokeyword.fragmentation.helper.ExceptionHandler;

/**
 * Created on 2019/1/16.
 *
 * @author 郑少鹏
 * @desc Fragmentation初始化配置
 */
class FragmentationInitConfig {
    static void initFragmentation() {
        // 建于Application初始化
        // 更多查看wiki或demo
        Fragmentation.builder()
                // 栈视图模式默悬浮球模式
                // SHAKE摇一摇唤出、NONE隐藏
                // 仅Debug环境生效
                .stackViewMode(Fragmentation.BUBBLE)
                // 测试场景.debug(true)
                // 实际场景.debug(BuildConfig.DEBUG)
                .debug(true)
                // 可获{@link me.yokeyword.fragmentation.exception.AfterSaveStateTransactionWarning}
                // 遇After onSaveInstanceState时不抛异常而是回调到下面ExceptionHandler
                .handleException(new ExceptionHandler() {
                    @Override
                    public void onException(@NonNull Exception e) {
                        // 以Bugtags为例(传捕获Exception到Bugtags后台)
                        // Bugtags.sendException(e);
                    }
                })
                .install();
    }
}

SupportActivity独有API

setDefaultFragmentBackground(@DrawableRes int backgroundRes);

Fragment根布局没设background属性时Fragmentation默以Theme之android:windowBackground作Fragment背景。
通该法可改其内所有Fragment默背景。

SupportHelper之API

SupportHelper.showFragmentStackHierarchyView();

查看栈视图Dialog。
SupportHelper.logFragmentStackHierarchy(TAG);

打印查看栈视图Log。
SupportHelper.findFragment(fragmentManager, tag/class)

据class/tag找Fragment。

API一览

除特别标注API,其它API于SupportActivity和SupportFragment都有。

装载根Fragment

通于findChildFragment(ChildFragment.class)==null时load。

loadRootFragment(int containerId, SupportFragment toFragment)
loadRootFragment(int containerId, SupportFragment toFragment, boolean addToBackStack, boolean allowEnterAnim)

装载根Fragment(即Activity内第一Fragment或Fragment内第一子Fragment)
loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments);

装载多根Fragment(同级Fragment场景)

同级Fragment场景切换:

showHideFragment(SupportFragment showFragment, SupportFragment hideFragment);

show一Fragment,hide一Fragment。
主用于类似微信主页切换Tab场景。
启Fragment
Activity用本质activity.getSupportFragmentManager().getTopFragment().start(f);
start(SupportFragment fragment)

启新Fragment(启后启动者和被启动者在同栈)
start(SupportFragment fragment, int launchMode)

以某启动模式启新Fragment。
startForResult(SupportFragment fragment,int requestCode)

启新Fragment并能接收新Fragment数据返回。
startWithPop(SupportFragment fragment)

启目标Fragment并关当前Fragment。
startWithPopTo(SupportFragment fragment, Class targetFragment, boolean includeTargetFragment)

启目标Fragment并关targetFragment之上Fragments。
// 1.0.0 New:可用extraTransaction() + start()实现上面各种startXXX()设置更多功能。
supportFragment.extraTransaction()
				// 自定tag
                .setTag(tag)  
                .addSharedElement(xx).setLaunchMode(SINGLETASK).withPop(true).forResult(1)
                .start()
                .popTo(tag, includeTagFragment)
              //.dontAddToBackStack()
              //.add()
              //.remove(f) ...

SupportFragment仅有:

replaceFragment(SupportFragment toFragment, boolean addToBack)

replace方式启目标Fragment(配replaceLoadRootFragment()用)
post(Runnable runnable)

Fragmentation事务内部通一ActionQueue队列排队执行,用该法可将自定任务(事务)入队执行。
出栈
pop();

出栈当前Fragment(于当前Fragment所在栈内pop)
popTo(Class targetFragment, boolean includeTargetFragment);

出栈targetFragment之上所有Fragments。
popTo(Class targetFragment, boolean includeTargetFragment, Runnable afterTransaction, int animation)

若出栈后紧接着.beginTransaction()开始一新事务,请用上法。
该法可自定出栈动画,可让动画看起来更自然。对动画无要求也可popTo() + 事务执行。

SupportFragment仅有(操作目标子Fragment):

popChild();
popToChild(Class fragmentClass, boolean includeSelf);
popToChild(Class fragmentClass, boolean includeSelf, Runnable afterTransaction);
popToChild(Class fragmentClass, boolean includeSelf, Runnable afterTransaction,int popAnim);
查找Fragment
getTopFragment();

所在栈内栈顶Fragment。
getPreFragment();

当前Fragment所在栈内前一Fragment。
findFragment(Class fragmentClass);

通class获所在栈内某Fragment。

SupportFragment仅有(从子栈查找):

getTopChildFragment();
findChildFragment(Class fragmentClass);
输入法相关

因Fragment被出栈时不自隐软键盘及弹软键盘麻烦,故提下面两法:

hideSoftInput();

通于hide隐软键盘
showSoftInput(View view);

显软键盘(调该法后于onPause自隐)

Demo

猜你喜欢

转载自blog.csdn.net/zsp_android_com/article/details/86592026