作者yrulee (Face the truth.)
看板AndroidDev
标题Re: [问题] 请问取得先前使用的fragment?
时间Fri Oct 10 06:40:26 2014
※ 引述《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://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1412894428.A.8A6.html