Fragmentation

Fragmentation

基本

API

核心概括

  • loadRootX()系列操作对象是孩子Fragment。为避被强杀重启后重复load,建于findChildFragment(ChildFragment.class)==null时load;
  • startX()popX()find/getX()系列操作对象是兄弟Fragment;
  • popChildX()find/getChildX()系列操作对象是孩子Fragment。
Application初始API
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或demoFragmentation.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();}
}
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自隐)

依赖

implementation 'me.yokeyword:fragmentation:1.3.6'

使用

onSupportVisible()
  • onSupportVisible()等生命周期调用顺序onActivityCreated() -> onResume() -> onSupportVisible -> onLazyInitView() -> onEnterAnimationEnd -> onSupportInvisible() -> onPause()。
  • Fragment可见时调(含嵌套子Fragment)。
  • A内子FragmentB,B通A startFragment©(此时A和C同级)。pop©都调A和B之onSupportVisible()。
  • View安全法(调时onCreateView()已被调)。
懒加载、优化Animation性能
  • 用Fragment过程某些场景需懒加载,如FragmentAdapter懒加载、同级Fragment切换懒加载。库自0.8提供onLazyInitView(Bundle saveInstanceState)。
  • 该法于Fragment第一次对用户可见时(第一次onSupportVisible())调。
  • View安全法(调时onCreateView()已被调)。
转场动画
通SupportActivity设全局Fragment转场动画

复写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

更新

1.0

1.2

1.3
特性

startWithPopTo()(替代popTo(fg,boolean,runnable() -> start(),动画更自然)。popTo()仍保留增强出栈法(pop()/popTo())健壮性。

优化

start()添简单防抖机制。

历史版本

注意

  • startLoad
    于onLazyInitView打开新页面执行startLoad,打开已打开页面不再执行。于onCreateView初启应用执行所有页面逻辑操作,此后不再执行。
  • pop()与_mActivity.onBackPressed()
    • FragmentA(继承{@link BaseFragment})嵌套FragmentB。
    • FragmentB之Toolbar通{@link #stepToolbarNavigation(Toolbar)}初始。
    • FragmentB通{@link #start(ISupportFragment)}开启FragmentC,FragmentB与FragmentC同栈且都嵌套于FragmentA。
    • FragmentA之Toolbar通{@link #stepToolbarNavigation(Toolbar)}初始。
    • 点返回键FragmentA出栈需参照{@link fragmentation.zhihu.fragment.second.other.ZhiHuDetailFragment#onBackPressedSupport()}复写{@link #onBackPressedSupport()}。
    • {@link #onBackPressedSupport()}中需{@link #pop()}不可_mActivity.onBackPressed()。
    • 其它处可_mActivity.onBackPressed()。

滑动

xxx

EventBus

依赖

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正常显。

Demo


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部