三週半的時間,做完了第一份實習工作的第一個項目,雖然沒有用到太複雜的知識,但是從基礎角度長進不少,現在項目收尾,分幾篇博客來總結一下在這裏面學到的知識。
本文從整體來說。
學習了fragment,這個項目就基本全都是用fragment來做的。
“儘量少用new操作”–在一些可以重複利用的fragment上,採用類似單例模式的“私有實例,私有構造函數,public的get實例函數”,若不爲null則直接返回該對象,null則new。
//私有實例
private static LoginSecondStep_Fragment loginSecondStep_fragment;
/**
* 私有構造函數
*
* @param phone
* @param AorB
*/
private LoginSecondStep_Fragment(String phone, boolean AorB) {
this.phone = phone;
this.AorB = AorB;
//只要執行new操作,就將原值更改
isNew = true;
}
/**
* 對外接口,返回實例
*
* @param phone
* @param AorB
* @param ifSendPhone
* @return
*/
public static LoginSecondStep_Fragment getMe(String phone, boolean AorB, boolean ifSendPhone) {
/**
* 只要需要上傳手機號,就必須new
* 不上傳手機號,但是null,就new
* 不上傳,也不爲空,直接返回
*/
if ((ifSendPhone) || (!ifSendPhone && loginSecondStep_fragment == null)) {
Log.i("second", "new");
loginSecondStep_fragment = new LoginSecondStep_Fragment(phone, AorB);
}
return loginSecondStep_fragment;
}
其次,fragment的切換
因爲在同一個Activity上託管着很多fragment,我第一次做的切換,使用hide & show來做的,結果導致後面重用的時候,出現了bug,一個頁面的倒計時,出現了計時混亂。
後來改用replace。
用replace的話,如果調用方不採用addToBackStack(null) 調用方則直接逐步執行生命週期函數,進入onDetach
採用addToBackStack(null)後,調用方不執行onDestory onDetach。(大量博客顯示採用addToBackStack(null)並不是放進棧裏,而是重新建立了一個新的實例區域,暫時不用,我還沒仔細看)。
一些保存操作,上傳數據操作,儘量放在生命週期函數裏進行。
eg.
@Override
public void onPause() {
super.onPause();
//對上一頁的姓名進行操作
if (getTargetFragment() == null) {
return;
} else {
Intent i = new Intent();
i.putExtra(Setting_Userinfo_Fragment.EXTRA, et.getText().toString().trim());
getTargetFragment().onActivityResult(getTargetRequestCode(), Setting_Userinfo_Fragment.REQUEST_Truename, i);
}
}
針對具體情況,具體分析生命週期,藉助生命週期函數。
接下來仔細去寫。