最近做新項目用Fragment做標籤頁切換,由於不需要滑動,所以就想到了FragmentTabHost,但是發現了它的一個問題,就是每次切換tab的時候聲明週期都會重新加載頁面,如何避免這種情況呢~
首先我們先看一下Fragment第一次加載執行的生命週期:
我們是在onCreateView裏面執行頁面加載並初始化數據的,當我們切換tab頁的時候看看他走了哪些生命週期:
可以看到它執行了onDestroyView的方法,所以下一次再切換回第一個tab的時候還是重新初始化頁面,走進onCreateView方法,但不同的是他不會再走進onCreate方法。
由此可知,我們fragment裏面的對象其實還沒有被銷燬,只不過view重新繪製了,我們可以把第一次加載的view存起來,然後進行判斷,這樣就可以保存狀態了。看起來非常簡單嘛
private View rootView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
L.d("執行onCreateView");
if(rootView == null) {
T.show(activity, "MineFragment創建");
rootView = inflater.inflate(R.layout.fragment_mine, null);
tv_mine = (TextView) rootView.findViewById(R.id.tv_mine);
tv_mine.setText("第一次創建");
} else {
return rootView;
}
return rootView;
}
實際效果