大话Fragment管理
大話Fragment管理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?上一個項目遇到了一個Activity 管理30個Fragment的情況,剛開始的時候真的管理的焦頭爛額,但是后來不停的研究api文檔,漸漸的明白了android的Fragment管理 體系。下面用一種Fragment嵌套Fragment的情況來總結一下Fragment的管理。 ? ? ?
? ? ? ? ? ?
? ? ?
上圖的布局,大神立馬就能看出來,最外面一個Activity,底下首頁,分類,購物車..是第一層一個 FragmentTabHost,而首頁里面的類別01,02....是用的開源庫TabPageIndicator管理的ViewPager,管理這第 二層的n個Fragment。 ?
1.當遇到這種嵌套多層的Fragment的時候第一個主要點就是第一層的FragmentManager,可以通過getSupportFragmentManager()或者getFragmentManager()獲得,但是在 ? ?第二層的fragment中如果想獲得FragmentManager就不能這樣了,必須用getChildFragmentManager()。 ?
? ? ?
2.當點擊一個其中一個商品的詳情的時候,如果想保持底部的TabHost那就不能用Activity,還得保持Fragment, 其實還有另一中方案,那就是最外面的Activity用TabHostActivity,為什么沒用尼,因為TabHostActivity已經被廢棄 了,當我看到那條廢棄的橫線時,就好像看到一個美女臉上被刀開花了一樣,心痛啊,不能娶這樣的媳婦啊,直接換FragmentTabHost,黃花大閨 女,唉呀媽呀,老裝逼了。回到需求,當點擊其中一個商品時候,要將底部的TabHost保持,上面的布局都換成詳情的布局,看下Api, ? ?FragmentTransaction ? ?提供add,replace倆個方法,那么用add還是replace尼? ? ?使用add()加入fragment時將觸發onAttach(),使用attach()不會觸發onAttach(), ? ?使用replace()替換后會將之前的fragment的view從viewtree中刪除。 ?
? ? ?觸發順序: ? ? ?
? ? ? ? ? ? ?detach()->onPause()->onStop()->onDestroyView() ? ? ?
? ? ? ? ? ? ?attach()->onCreateView()->onActivityCreated()->onStart()->onResume() ? ? ?
? ? ? ? ? ? ?使用hide()方法只是隱藏了fragment的view并沒有將view從viewtree中刪除,隨后可用show()方法將view設置為顯示 ? ? ?
? ? ? ? ? ? ?而使用detach()會將view從viewtree中刪除,和remove()不同,此時fragment的狀態依然保持著,在使用attach() 時會再次調用onCreateView()來重繪視圖,注意使用detach()后fragment.isAdded()方法將返回false,在使用 attach()還原fragment后isAdded()會依然返回false(需要再次確認) ? ? ?
? ? ? ?執行detach()和replace()后要還原視圖的話, 可以在相應的fragment中保持相應的view,并在onCreateView()方法中通過view的parent的removeView()方法將view和parent的關聯刪除后返回。 ?
3.在復雜的Fragment管理中,經常會遇到 Fragment already added 錯誤,解決這樣的錯誤方法就是,每次添加Fragment,先findFragmentByTag,如果找到了fragment.isAdded(),那 么就return,跳出,如果Fragment沒在棧中,那就把Fragment Add上去,下面放出一個Fragment管理的公用類 ?
?最后為什么用ft.commitAllowingStateLoss(); 而不是ft.commit();呢?
? ? ? ? ? ?? commitAllowingStateLoss和commit的區別是當退出activity時,防止提交后的狀態丟失。對于你覺得可以丟失提交的狀況,使用commitAllowingStateLoss() ? ? ? ?。 ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ?4.最后再介紹一種情況,還是上面 的圖,當在首頁里面,進去了很多層,棧上面疊加了很多Fragment的時候,如果想再次點擊TabHost的首頁,能返回到最初首頁的頁面的話,那就要 把首頁的Fragment上面的Fragment的彈出,TabHost的再次點擊事件: ? ? ? ? ? ?
mTabHost.getTabWidget().getChildAt(i).setOnClickListener(new?OnClickListener()?{???????????@Override???????????
????????????public?void?onClick(View?v)?{???
??????????? getSupportFragmentManager().popBackStack(null,?
????????????????????FragmentManager.POP_BACK_STACK_INCLUSIVE);?mTabHost.setCurrentTab(j);mIsCanEixt?=?true;????????????}});?解釋一下: ?
getSupportFragmentManager().popBackStack(null,?FragmentManager.POP_BACK_STACK_INCLUSIVE);?google提供了幾種彈出棧的方法:
public abstract void popBackStack() ?
Added in? ? ?API level 11 ?
Pop the top state off the back stack. This function is asynchronous -- it enqueues the request to pop, but the action will not be performed until the application returns to its event loop.
public abstract void? ? ?popBackStack? (Stringname, int flags) ? ? ?
public abstract void? ? ?popBackStack? (int id, int flags) ?
public abstract boolean? ? ?popBackStackImmediate(int id, int flags) ?
popBackStack(),配套使用的是ft.addToBackStack(tag);能在按返回鍵的時候,返回上一個fragment
popBackStack(String name, int flags),如果name不為空,那么在這個Fragment上面的Fragment都會被彈出?
| Either 0 or? POP_BACK_STACK_INCLUSIVE . |
0是不包括自己, ?POP_BACK_STACK_INCLUSIVE ?. ?
5.最最后,再加一個Fragment問題的解決,當Fragment的棧里面有幾個fragment的時候,會出現,當你觸摸當前 fragment的時候,下層的fragment的事件被觸發,這是由于Touch事件泄露傳到了下層中。解決方法就是攔截onTouch事件 ?
//?將上層的觸摸事件攔截??@Override??public?boolean?onTouch(View?v,?MotionEvent?event)?{????return?true;??}?在onViewCreated里面設置監聽 ?
@Override??public?void?onViewCreated(View?view,?Bundle?savedInstanceState)?{????//?攔截觸摸事件,防止泄露下去????view.setOnTouchListener(this);????App.showLog(this.getClass().getSimpleName()?+?"??onViewCreated()");????super.onViewCreated(view,?savedInstanceState);??}google推出Fragment是為了適配平板,也方便開發者更靈活的布局,實現更多的交互效果,這次項目,還沒有將Fragment的特性都掌握,看 api的時候還是不能領會老外的想法,如果我要是老外的時候,看api就像看電視機的說明書一樣,那多爽啊,因為api里面還有那么多方法沒用過,但是我 相信那些方法都是合理存在的。 ?
?
轉載于:https://blog.51cto.com/6169621/1542223
總結
以上是生活随笔為你收集整理的大话Fragment管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H.264可伸缩编码SVC
- 下一篇: 结对开发:电梯调度(2)