日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大话Fragment管理

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话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,黃花大閨 女,唉呀媽呀,老裝逼了?;氐叫枨?#xff0c;當點擊其中一個商品時候,要將底部的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管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。