※ 引述《htury (冰點)》之銘言:
: 我發現為什麼取的null了
: 因為getChildFragmentManager
: 這時候是FragmentB的manager而不是FragmentA的
: 然後我先設個static 指向FragmentA
: 也順利取的FragmentA上的CalendarFragment
: 想要放到FragmentB上,這時候有exception
: java.lang.IllegalStateException:
: Can't change container ID of fragment CalendarFragment
: {4237c460 #0 id=0x7f060035 FragmentB}: was 2131099701 now 2131099691
: 有大大有解嗎?
: 以下舊文
: ================
: 想請問如何在同一個activity
: 使用同一個fragment
: 類似airbnb的日曆點選
: http://ppt.cc/wXLp
: 然後進到另一個fragment後又要取的同樣的fragment
: 嵌入在別的fragment
: 類似airbnb點選dialogFragment的日曆也嵌入在裡面
: 然後有顯示剛剛選的日期
: http://ppt.cc/j9j~
: ------------------- ---------------
: |Activity |同一個activity
: |------------------ |--------------
: ||FragmentA ||切換成FragmentB
: ||----------------- ------> ||--------------
: |||CalendarFragment |||CalendarFragment
: |||點選日期後的狀態 |||想取得FragmentA的CalendarFragment
: ||| |||但是是null
: ||| |||只好重新new 在塞值
: ||| |||
: code如下:
: FragmentManager fm = getChildFragmentManager();
: CalendarFragment fragment = (CalendarFragment) fm.findFragmentById(R.id
: FragmentTransaction ft = fm.beginTransaction();
: ft.replace(R.id.layout_fragment, fragment);
: ft.commit();
: 會產生nullPointException
: 追蹤後fragment是null??
: 是因為切換另一個fragment會導致CalendarFragment OnDestroy?
: 就要在new一個CalendarFragment
: FragmentManager fm = getChildFragmentManager();
: CalendarFragment fragment = (CalendarFragment) fm.findFragmentById(R.id.fragment_calendar_click_view);
: if (fragment==null || ! fragment.isInLayout()) {
: fragment = new CalendarFragment();
: FragmentTransaction ft = fm.beginTransaction();
: ft.replace(R.id.layout_fragment, fragment);
: ft.commit();
: }
: 但是因為使用new 所以前面點選的日期沒有被記住
: 可能要用sharedpreference來記住套回來用?
: 不知道各位先進有其他的方法嗎?
以下 ft 代表 FragmentTransaction, fm 代表 FragmentManager
1. 加入fragment時,使用 ft.add(viewID, fragment, tag)
2. 替換fragment時,使用 ft.detach() ,此fragment的onDestroyView()會被call, 但o
nDestroy()不會
3. 重新加入fragment時,先使用 fm.findFragmentByTag() http://goo.gl/OUMnmT 找出
該fragment,再使用 ft.attach() 重新加入
千萬別用class member保存fragment instance,因為configuration change時,例如螢
幕旋轉或是系統字型變更時,activity/fragment會被重建,這時原本放在class member
的fragment instance就會leak。
你會發現 fm.getFragments() 裡有多個 leaked fragments ( fm.getFragments() 可取
出所有被fm所掌管的fragments,為hidden method,故建議僅可拿來印出debug log用,
詳細資訊參考 http://goo.gl/FAkobu )
如同以上所述,要找出已經add過的fragment,可使用fm.findFragmentByTag()
--
Sent from my Android
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.68.213
※ 文章網址: http://www.ptt.cc/bbs/AndroidDev/M.1412894428.A.8A6.html