看板 AndroidDev 關於我們 聯絡資訊
※ 引述《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