顯示具有 Fragment 標籤的文章。 顯示所有文章
顯示具有 Fragment 標籤的文章。 顯示所有文章

2018年1月16日 星期二

[Android] Fragment用add加入後,Actvity重建時發生神奇疊圖事件,怎辦?

問題:
決定挑戰add加Fragment,結果在旋轉畫面後跟Activity被回收後,發現容器裡2個Fragment疊在一起了,怎辦呀?

處理:Google 「Fragment 重疊」

參考:CSDN簡書1簡書2腳本之家

說明:
會發生Fragments重疊的情況,一定是用add,而且加過2個Fragment或以上,然後發生了Activity重建的事件(會跑到onSaveInstanceState > onCreate)。

原因在於沒記住Fragment hidden狀態下又重建重加,就蓋囉~

解法有好幾種,可看參考,我的作法是

  • 融合CSDN的設定轉向不重建Activity(android:configChanges)
  • 加上腳本之家的存取目前頁面index,存的地方也是onSaveInstanceState,只是我讀的地方是onCreate,避免onCreate處理完onRestoreInstanceState又處理一次。
  • 用index去FragmentManager裡先找看有沒有加過,沒有才根據index新建Fragment。再看這fragment的isAdded()來決定要add還是要show。


2018年1月15日 星期一

[Android] Fragment 更換,該用add,還是replace呢?

問題:
我有個主頁面,想根據選單變更裡面的Fragment,發現有兩種換fragment的方法,該用哪種呢?

處理:Google 「fragment add replace」

參考:泡在網上的日子幫庫編程StackOverflowAndroid Advenced

說明:主要是看需求...兩個都能達成對方的行為,只是要注意寫法

  1. 用add換的話,容器裡有多個frgments,要自己注意寫hide/show事件很煩、要自己處理frgment疊圖事件很煩、要從fragmentManager裡找出來避免重複加很煩,那到底有啥好處?
    =>不會跑全部生命週期,秀過一次再秀較快,也會保留之前狀態,適合幾個會切換的fragments組合。
     
  2. 用replace換的話,容器裡只有一個fragment,寫法較簡單,一開始碰fragment不想花時解add問題的,就用replace吧;
    =>只是它每次會跑fragment的全部生命週期,所以重複換頁較add慢一點(慢多少看你生命週期做多少事),要回復之前狀態要自己寫。

上面有個重點:「生命週期 (life cycle)」,如果要在Fragment的特定生命週期做事,且確保用的方法是符合需求的,有跑到該跑的週期,沒跑到不該跑的程式。

至於哪些會跑到哪些不會跑到,因為case很多,就參考Android Advenced吧~
或著自己印Log囉~

2018年1月14日 星期日

[Android] android.support.v4.app.fragment vs android.app.fragment 該用哪個?

問題:
我想在App裡用Fragment做切畫面,結果發現有2個包都有Fragment到底該用哪個?

處理:
Google 「android.support.v4.app.fragment  android.app.fragment」


說明:
  1. 照一般說法,如果你的min>=API 11(Android 3.0),應該就是用android.app.fragment。
    現在大部分App min都至少15(Android 4.0.3)起跳了吧,也有看過min設21 (Android 5)的。以2018/01的分布來看,80%涵蓋選21、90%涵蓋選19、95%涵蓋選17,怎樣都超過11呀...
  2. 那實際上呢? 因為Fragment及其相關類別(FragmentManager、FragmentTransaction)還在一直加功能,如果Min不等於Target,有些新功能在android.app.fragment用不了,或是要認裝置版本跑;用v4包的話,寫法就都一樣了。就看有沒有要用到後來的新功能,或是為那新功能自己寫實作在Base之類。

其他要注意的點,就是選好要用哪邊的話就全套都用那邊了...
Fragment、FragmentManager、FragmentTransaction、FragmentPagerAdapter、Activity

這次你選擇哪一邊呢?(咦? 元件東西軍嗎?)