使用 `Fragment + ViewPager` 時,滑動切換頁面會觸發 `onDestroyView` -> `onCreateView` 重建,導致佈局重新加載、數據重複請求,造成卡頓和流量浪費。默認 `ViewPager` 只緩存當前頁及相鄰頁,第三頁的 View 會被銷毀。
實驗 4 個 Fragment,滑動日誌顯示:
結論:`onCreateView` 多次調用,`onCreate` 僅調用一次。
public abstract class BaseFragment extends Fragment {
private View rootView;
protected Context context;
private boolean hasInitData = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (rootView == null) {
rootView = initView(inflater); // 子類實現佈局加載
}
// 關鍵:從父容器移除,防止 "already has parent" 崩潰
ViewGroup parent = (ViewGroup) rootView.getParent();
if (parent != null) parent.removeView(rootView);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (!hasInitData) {
initData(); // 子類實現數據加載,僅執行一次
hasInitData = true;
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
// 不再需要手動 removeView,onCreateView 會處理
// 但若需釋放圖片等資源可在這裡處理
}
protected abstract View initView(LayoutInflater inflater);
protected abstract void initData();
// 封裝網絡請求...
}