Fragment进入退出动画(Fragment转场动画)

Fragment进入退出动画(Fragment转场动画),第1张

在activity中开启fragment时,FragmentTransaction在add()或replace()之前,调用setCustomAnimations()来实现fragment转场动画

setCustomAnimations()方法还有一个两个参数的重载方法可以使用;

该方法需要在资源文件res/anim下添加转场动画,如下:

注意:1.该方法一定要在add或replace之前调用,否则无效;2.setCustomAnimations方法有一个很大的bug,就是在内存重启后所有设置的动画都将失效。

setTranseion是FragmentTransaction的方法,而onCreateAnimation是Fragment的方法,一般两个方法需要配合使用。而且它们不会像setCustomAnimations一样,即使是内存重启也不会失效,因为他们是动态调用的。

先来看一下setTranseion方法:

很明显,要实现动画,我们只能传TRANSIT_FRAGMENT_OPEN和TRANSIT_FRAGMENT_CLOSE,他们分别表示进场和退场,首先使用FragmentTransaction设置Transeion:

单独使用setTranseion的话,FragmentManager会生成默认的动画;源码如下:

setTranseion和和Fragment的onCreateAnimation配合使用:

transit对应FragmentTransaction设置的动作,onCreateAnimation在Fragment的每个 *** 作动作中都会被回调,最好是配合FragmentTransaction的setTranseion方法使用,才能更加灵活的实现各种动画,不然onCreateAnimation方法的transit参数永远是0,而nextAnim与setCustomAnimations有关,而一般不推荐使用setCustomAnimations。

FragmentTransaction ft = getFragmentManager().beginTransaction()

//设置进入退出动画

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right)

DetailsFragment newFragment = DetailsFragment.newInstance()

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment")

// Start the animated transition.

ft.commit()

Activity用来管理Fragment。因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了

Fragment具有自己生命周期,是模块化UI的良好组件。

Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。

Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。

可以看出Fragment生命周期与Activity类似

解释如下:

上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。

因为Fragment依赖Activity,那么Fragment和Activity的生命周期可谓是息息相关,如下图所示

Activity的FragmentManager负责调用队列中Fragment的生命周期方法,只要Fragment的状态与Activity的状态保持了同步,托管Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致。

Activity-onCreate(begin) ,Fragment-onAttach-onCreate-onCreateView-onViewCreated, Activity-onCreate(end) ,Fragment-onActivityCreated, Activity-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume

Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop

Activity-onRestart-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume

Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop ,Fragment-onDestroyView-onDestroy-onDetach, Activity-onDestroy

Fragment的管理则交由FragmentActivity的FragmentManager来实现。

获取方式:

注意 :在fragment创建childFragment的时候,需要注意的是:使用getChildFragmentManager() 使用getFragmentManager()会导致内存泄漏

常用API:

popBackStackImmediate相关的方法与上面逻辑是一样的与上面不同的是,在调用的时候会立即执行d出。

通过FragmentTransaction实现在Activity运行时可动态地加入、移除、交换Fragment

FragmentTransaction的主要方法介绍

针对在一个Activity中的某个Layout中切换Fragment,无非两种方法:

当移除或替换一个片段并向返回栈添加事务时,系统会停止(而非销毁)移除的片段。 如果用户执行回退 *** 作进行片段恢复,该片段将重新启动。

具体实例可参看: Fragment的addToBackStack()使用

commit(), commitNow()和commitAllowingStateLoss()区别分析

实例:

使用setArguments(Bundle args)传递,在onCreate中使用getArguments()取出。和Activity的Intent恢复机制类似。

1、如果你需要在Fragment中用到宿主Activity对象,建议在你的基类Fragment定义一个Activity的全局变量,在onAttach中初始化,这不是最好的解决办法,但这可以有效避免一些意外Crash。

2、onHiddenChanged的回调时机

当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()

推荐阅读: Fragment全解析系列(二):正确的使用姿势 、 Fragment全解析系列(一):那些年踩过的坑


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11465776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存