項目中部分功能模塊采用了單Activity+多Fragment模式,當Fragment切換時,需要在過渡動畫執(zhí)行完后做一些操作,通常就是在自己封裝的FragmentBase中重寫onCreateAnimation方法,創(chuàng)建一個Animation對象,并添加動畫的事件監(jiān)聽。而最近升級了v4包后,突然發(fā)現(xiàn)添加的動畫事件監(jiān)聽無響應了。通過查看源碼,發(fā)現(xiàn)在v4包中關于Fragment管理類FragmentManagerImpl中,在獲取Animation對象后,也添加了對動畫的監(jiān)聽事件,也就覆蓋了我自己在onCreateAnimtion方法中對Animation動畫的事件監(jiān)聽。
我們知道,F(xiàn)ragment生命周期不同階段的處理主要在android.support.v4.app.FragmentManagerImpl.moveToState方法中,而如下代碼則是當Fragment第一次加載時截取的部分代碼,其中我們看到在執(zhí)行performCreateView方法以后,有一個對loadAnimation方法的調用,這個方法會執(zhí)行我們在FragmentBase中實現(xiàn)的onCreateAnimation方法,并返回Animation對象,而獲取到Animation對象后,調用了setHWLayerAnimListenerIfAlpha方法。
FragmentManagerImpl的moveToState方法:
case 1: if(newState > 1) { if(DEBUG) { Log.v("FragmentManager", "moveto ACTIVITY_CREATED: " + f); } if(!f.mFromLayout) { ViewGroup v = null; if(f.mContainerId != 0) { &nb