V4包下Fragment替換為源碼下Fragment的心路歷程

首先來看一下android.support.v4.app.Fragmentandroid.app.Fragment這兩包的區別:

1.最低支持版本不同
android.app.Fragment 兼容的最低版本是android:minSdkVersion="11" 即3.0版
android.support.v4.app.Fragment 兼容的最低版本是android:minSdkVersion="4" 即1.6版
2.需要導jar包
fragment 在定義的時候,要導入的包不同
android.support.v4.app.Fragment 需要引入包android-support-v4.jar
android.app.Fragment 需要導入的是android-app.jar
3.繼承的父類不同,在fragmentManager 在Activity中取的方法不同
android.support.v4.app.Fragment使用 fragmentManager=getSupportFragmentManager()獲得 ,并且當前的類必須繼成FragmentActivity
android.app.Fragment使用 fragmentManager=getFragmentManager() 獲得 ,繼承Activity即可。
4.<fragment>標簽問題
app.fragment和v4.fragment都是可以使用<fragment>標簽。
只是在使用的時候如果是app.fragment則沒有什么特殊的地方繼承Activity即可。
當v4.fragment使用<fragment>標簽的時候就要特別注意了:
當這個Activity的布局中有<fragment>標簽的時候,這個Activity必須繼承FragmentActivity,否則就會報錯。

關于這個<fragment>標簽的問題要著重強調一下,app.fragment是可以使用<fragment>標簽的,很多網上都得文章說是不支持,是錯誤的。

綜上所述,在安卓4.4 5.0 乃至6.0系統的今天,源碼下的Fragment可以使用了。也許你會說,閑著沒事改V4包下的Fragment干嘛啊,沒辦法這都是被被逼的啊,產品需求。。。如圖:

Paste_Image.png

原先的關注按鈕直接跳轉一個Activity展示別的頁面,而現在需求是點擊選擇展示成另一個界面,并且下面的四個按鈕是仍然展示的。

很顯然原先的Activity現在不可行了,只能是Fragment了。老大找了開源的項目,也是Fragment翻轉的,核心的代碼就是:

getFragmentManager() .beginTransaction().setCustomAnimations(
R.animator.card_flip_horizontal_right_in, 
R.animator.card_flip_horizontal_left_out, 
R.animator.card_flip_horizontal_left_in, 
R.animator.card_flip_horizontal_right_out)                     
.replace(R.id.container, attentionFragment) 
.commit();

在Values文件夾下新建animator文件夾置代碼里面的四個動畫文件,內容如圖所示:

Paste_Image.png

萬事具備只欠東風,程序運行點擊按鈕,程序就崩潰了。報錯為:
Unknown animation name: objectAnimator異常,谷歌搜索答案很多,終于找到一個靠譜的,網址如下
http://blog.csdn.net/xyz_fly/article/details/36179515
總結一下就是,在使用V4包中Fragment時,使用的切換動畫效果,其動畫文件中不能包含objectAnimator,Animator這類標簽。如果必須要使用,請將工程中使用的V4包中Fragment相關類,換成源碼中的Fragment相關類。
意思很明確,就是V4包下 的Fragment不支持屬性動畫,只支持位移動畫,要做旋轉的話只能用源碼中的Fragment。。。。仔細看了看三方代碼里面用的是android.app.Fragment。

原先項目中的Fragment的初始化時放在XML的<fragment>標簽中的,一開始上網搜索經不權威人士的文章誤導,以為android.app.Fragment不支持<fragment>標簽,這樣一改就改大發了,遂想另一個辦法:

不對Fragment進行屬性動畫設置,改為設置成替換的布局的屬性動畫,即對布局進行單獨的屬性動畫設置:

ObjectAnimator ra = ObjectAnimator.ofFloat(view, "rotationY", 0, 360);
ra.setDuration(1500);
ra.start();

效果的話就不盡人意了,可以理解為空中旋轉一周,體驗很差,我們的要求是一般旋轉180度就好,改為180度后,旋轉話畫面直接就直接倒置了,誰讓是對布局進行的動畫呢。這一方案也破滅了。。。

后來發現android.app.Fragment也支持<fragment>標簽了,這告訴我們要理論聯系實際啊。要把項目里的V4包下的Fragment全部換成android.app.Fragment,因為項目里面沒有做一個基類的BaseFragment,這工作量你懂得。。。 不光Fragment的引用要改,
getSupportFragmentManager()也要改為getFragmentManager(),少年你以為這些就夠了嗎?后面還有更大的坑呢。。。

改到FragmentPageAdapter的時候就出問題了,因為源碼里面沒有這個類。。。沒辦法,繼續谷歌,找到如下文章:
http://www.xiufm.com/thread-14680-1-1.html

大體意思就是,原先改的時候就是在V4包下的FragmentPageAdapter里面修改getSupportFragmentManager()為getFragmentManager(),不過后來谷歌意識到了這個問題在V13包里面添加了這個FragmentPageAdapter類,也可以直接在build里面添加V13包的引用,但是為了一個類把包全引用有點浪費,不如直接在源碼里面直接把相對應的類及其相關的都拷貝出來放到代碼里面。

期間引用的三方項目里面也有引用V4包FragmentPageAdapter的地方沒辦法,去看源碼,改依賴為直接粘貼代碼到項目中。

另一個展示的頁面如下布局:


Paste_Image.png

這是一個Fragment,里面用的是Viewpager,欄目跟健康號可以來回切換,上面掛載的是兩個Fragment,經過上面的操作,動畫可以完美運行了,但是當第二次進入這個頁面的時候,掛載的Fragment的數據不展示了,挺費解的,遂谷歌一番。找到如下網頁:
http://blog.csdn.net/u014452224/article/details/45920315?spm=5176.8246799.blogcont.4.nDyPzm

大體意思就是第二次加載的時候重復調用了onCreateView()這個方法,重新new了一個pageadapter導致子fragment不顯示,原因的話現在還有點費解,先解決問題上代碼,在主Fragment里面做如下操作

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   
   if (view != null) {        
    unbinder = ButterKnife.bind(this, view);        
   ViewGroup parent = (ViewGroup) view.getParent();       
   if (parent != null) {            
    parent.removeView(view);       
   }      
  return view;   
 }   
 view = inflater.inflate(R.layout.activity_my_attention, null);    
  unbinder = ButterKnife.bind(this, view);   
  initView();   
 return view;
}

請注意我里面用的是ButterKnife來初始化話控件,

unbinder = ButterKnife.bind(this, view);   

這句代碼必須放在每個判斷語句里面,不然的話會報錯。

這樣的話我們就完成了Fragment的替換,真是一波三折啊,動畫效果的話也完美實現

前人鋪路,后人共勉啊。。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,607評論 25 708
  • 內容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,838評論 22 665
  • 梅花幾度雪中開,疏影虬枝畫里來。 鐵骨錚錚昭日月。要為人間報春回。
    清風1閱讀 204評論 0 1
  • 昨天晚上看小王子,我更加明白了我們都是大人和孩子這句話了。小王子里面的女孩子,按照媽媽給她的計劃一步一步來發展,結...
    小小捷閱讀 243評論 0 0
  • 陰郁許久的天空終于放晴,我迫不及待的拿出板凳坐在門前貪婪的享受這陽光的沐浴。 有時候會想我這些年是怎么過來的,...
    何花花閱讀 394評論 0 1