上一回我們有說到在針對頁面切換時,會使用replace來進行切換
但是如果使用太多卻會造成頁面重疊..
由於筆者今天在撰寫程式時,發現自己常用的Replace居然沒辦法將前一個頁面成功至換掉
導致新的頁面內容重疊在原來的顯示內容上
搞了半天發現問題仍然無法解決..
後來與實驗室的學長討論後才發現,原來Replace並不能隨便亂用
當頁面的層數大於等於4的時候,就會造成頁面重疊的情況發生。
後來看了一下官網的文件才發現到:
官方文件中解釋說:replace()
這個方法只是在上一個Fragment
不再需要時採用的簡便方法。
正確的切換方式是add()
,切換時hide()
,add()
另一個Fragment
;再次切換時,只需hide()
當前,show()
另一個。
這樣就能做到多個Fragment
切換不重新實體化。
範例程式碼:
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.addToBackStack(null);
if (!Detail.newInstance().isAdded()) { // 先判断是否被add過 如果沒有Add過 代表是第一次呼叫 則需要先add 其餘時候都直接使用show進行顯示
// hide裡面放的是自己當前所在的Fragment頁面,後面一定要.this才能夠指向現在要隱藏的頁面,否則會直接幫你生成一個新的頁面
transaction.hide(DataList.this).add(R.id.Content, detail).commitAllowingStateLoss(); // 隱藏當前頁面 並新增明細頁面
} else {
transaction.hide(DataList.this).show(detail).commitAllowingStateLoss(); //隱藏當前頁面 呼叫明細頁面
}
另外補充一點:
即使頁面不透過isAdded()
來判斷是否為第一次載入,直接使用也可以達到切換的效果,.show()
只是App在執行時,生命週期會比Add時還要來得短暫。
以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教:)
有任何家教、案子 或技術相關問題 請都歡迎聯繫我