在大多數項目中都會用到點擊標籤欄切換頁面這種功能,它的實現方式也有多種,從最先的tabhost+view,tablayout+viewpager,textview+viewpager,RadiuButton + FrameLayout 以及後面出的BottomNavigationView等等,原理都是用一個佔位View承載fragment,經過點擊標籤或者滑動來切換不一樣的頁面。網絡
關於替換的方式 ide
佔位view的最多見的一種寫法 佈局
這樣就至關於用這個View搭載了Frgament。直接這樣寫原本是沒問題的,可是若是類中有網絡請求這樣的耗時任務,快速頻繁的切換會致使崩潰,NoPointerException,ResouceNotFoundException。對象
解決方法,給每個frgament都綁定一個View,不要共用一個View,經過view.setVisibility的方式控制顯示隱藏,而後就完美解決崩潰的問題。事務
以後想一想若是有多個fragment來回切換, 而且頁面中有edittext 輸入框的話,.replace方法每次都會從新實例化fragment,致使前面咱們填的內容丟失。更加優雅的方式是使用Fragment提供的事務FragmentTransaction,而後用add的方法,而不是每次都用replace。it
在獲取FragmentTransaction對象後調用add方法。在add以前斷一下Fragment對象是否爲空,不爲空的話就用ft的hide方法把Fragment隱藏起來,然會出現佈局重疊的狀況。io
public void hideFragment(FragmentTransaction ft){ 原理
if (oneFm!=null){fragment
ft.hide(oneFm); }}請求
而後自行對比一下切換後輸入框內容區別:
replace方法
add 方法
能夠發現