1勃痴、getActivity()空指針
2售睹、異常:Can not perform this action after onSaveInstanceState
3、Fragment重疊異常-----正確使用hide擂啥、show的姿勢
4悯辙、Fragment嵌套的那些坑
5、未必靠譜的出棧方法remove()
6货裹、多個Fragment同時出棧的深坑BUG
7嗤形、深坑 Fragment轉(zhuǎn)場動畫
一、getActivity()空指針
原因:activity在可能發(fā)生內(nèi)存回收狀態(tài)時會調(diào)用 onSaveInstanceState方法保存狀態(tài)弧圆, Activity都可能會被系統(tǒng)回收然后重建赋兵,但Fragment并不會隨著Activity的回收而被回收,創(chuàng)建的所有Fragment會被保存到Bundle里面搔预,從而導(dǎo)致Fragment丟失對應(yīng)的Activity霹期。
解決辦法:
1、Fragment強(qiáng)引用Activity( 有引起內(nèi)存泄露的風(fēng)險拯田,但是相比Crash历造,這種做法可以接受的)
protected Activity mActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mActivity= (Activity) context;
}
@Override
public void onDetach() {
super.onDetach();
mActivity= null;
}
2、從Activity保存/恢復(fù)狀態(tài)入手
第1種船庇、不保存fragment的狀態(tài): 在Activity中重寫onSaveInstanceState方法吭产,將
//super.onSaveInstanceState(outState);
注釋掉,讓其不再保存Fragment的狀態(tài)溢十,達(dá)到fragment隨MyActivity一起銷毀的目的垮刹。
第2種 、重建時清除已經(jīng)保存的fragment的狀態(tài):在恢復(fù)Fragment之前把Bundle里面的fragment狀態(tài)數(shù)據(jù)給清除张弛。方法如下:
if(savedInstanceState!= null){
String FRAGMENTS_TAG = "android:support:fragments";
savedInstanceState.remove(FRAGMENTS_TAG);
}