核心概括
loadRootX()
系列操作对象是孩子Fragment。为避被强杀重启后重复load,建于findChildFragment(ChildFragment.class)==null
时load;startX()
、popX()
、find/getX()
系列操作对象是兄弟Fragment;popChildX()
、find/getChildX()
系列操作对象是孩子Fragment。package widget.fragmentation;
import com.lalala.lalala.BuildConfig;
import fragmentation.Fragmentation;
/**
* Created on 2019/1/16.
*
* @author 郑少鹏
* @desc Fragmentation初始化配置
*/
public class FragmentationInitConfig {
public static void initFragmentation() {
// 建于Application初始化
// 更多查看wiki或demo
Fragmentation.builder()
// 栈视图模式默悬浮球模式
// SHAKE摇一摇唤出、NONE隐藏
// 仅Debug环境生效
.stackViewMode(Fragmentation.BUBBLE)
// 测试场景.debug(true)
// 实际场景.debug(false)
.debug(BuildConfig.DEBUG)
// 可获{@link me.yokeyword.fragmentation.exception.AfterSaveStateTransactionWarning}
// 遇After onSaveInstanceState不抛异常而回调至下ExceptionHandler
.handleException(e -> {
// 以Bugtags为例(传捕获Exception至Bugtags后台)
// Bugtags.sendException(e);
})
.install();
}
}
setDefaultFragmentBackground(@DrawableRes int backgroundRes);
Fragment根布局没设background属性时Fragmentation默以Theme之android:windowBackground作Fragment背景。
通该法可改其内所有Fragment默背景。
SupportHelper.showFragmentStackHierarchyView();
查看栈视图Dialog。
SupportHelper.logFragmentStackHierarchy(TAG);
打印查看栈视图Log。
SupportHelper.findFragment(fragmentManager, tag/class)
据class/tag找Fragment。
除特别标注API,其它API于SupportActivity和SupportFragment都有。
通于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场景。
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);
getTopFragment();
所在栈内栈顶Fragment。
getPreFragment();
当前Fragment所在栈内前一Fragment。
findFragment(Class fragmentClass);
通class获所在栈内某Fragment。
SupportFragment仅有(从子栈查找):
getTopChildFragment();
findChildFragment(Class fragmentClass);
因Fragment被出栈时不自隐软键盘及弹软键盘麻烦,故提下面两法:
hideSoftInput();
通于hide隐软键盘
showSoftInput(View view);
显软键盘(调该法后于onPause自隐)
implementation 'me.yokeyword:fragmentation:1.3.6'
复写SupportActivity之onCreateFragmentAnimator()即可为该Activity下所有Fragment设转场动画,或setFragmentAnimator()动改动画。
@Override
public FragmentAnimator onCreateFragmentAnimator() {
// 自定动画
return new FragmentAnimator(R.anim.nav_default_enter_anim, R.anim.nav_default_exit_anim,
R.anim.nav_default_pop_enter_anim, R.anim.nav_default_pop_exit_anim);
}
主页四Fragment(A、B、C、D),头显FragmentA。后三个执行onAttach
->onCreateView
->onEnterAnimationEnd
,FragmentA执行onAttach
->onCreateView
->onSupportVisible
->onLazyInitView
->onEnterAnimationEnd
。A切B时FragmentB执行onSupportVisible
->onLazyInitView
。
基于场景一。FragmentA嵌套FragmentChild,FragmentChild通start(ISupportFragment)
开启FragmentOther,FragmentChild与FragmentOther同栈且都嵌套于FragmentA。此时FragmentA与FragmentChild同显,FragmentChild开启FragmentOther时,FragmentOther执行onAttach
->onCreateView
->onSupportVisible
->onLazyInitView
->onEnterAnimationEnd
。
略
略
增startWithPopTo()
(替代popTo(fg,boolean,runnable()
-> start()
,动画更自然)。popTo()
仍保留增强出栈法(pop()/popTo()
)健壮性。
对start()
添简单防抖机制。
xxx
implementation 'org.greenrobot:eventbus:3.1.1'
implementation 'me.yokeyword:eventbus-activity-scope:1.1.0'
Activity作用域EventBus。更安全,有效避after onSavenInstanceState()异常。
package module.whiteboard.bean.eventbus;
import com.netease.nimlib.sdk.msg.model.IMMessage;
/**
* Created on 2019/1/23.
*
* @author 郑少鹏
* @desc 白板学生提交消息
*/
public class WhiteBoardStudentSubmitMessage {
private IMMessage imMessage;
public WhiteBoardStudentSubmitMessage(IMMessage imMessage) {
this.imMessage = imMessage;
}
public IMMessage getImMessage() {
return imMessage;
}
}
EventBusActivityScope.getDefault(_mActivity).register(this);
@Subscribe
public void onWhiteBoardStudentSubmitMessage(WhiteBoardStudentSubmitMessage event) {
imMessage = event.getImMessage();
// 学生刷新
studentRefresh(imMessage);
}
EventBusActivityScope.getDefault(_mActivity).unregister(this);
Fragment布局设背景色后切现屏闪。
金色星星显示紊乱。
适配器构造法:
public ZhiHuPagerFragmentAdapter(FragmentManager fm, String... titles) {
super(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
mTitles = titles;
}
加FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
紊乱显。
去FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
正常显。