技術基礎 | Stargate入門
阿新 • • 發佈:2020-11-01
Fragment基本使用
Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大螢幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!
Fragment靜態使用
fragment我們可以在xml
佈局檔案中像UI控制元件一樣使用。
<fragment android:id="@+id/fragment_left" android:name="com.example.basic.LeftFragment" android:layout_width="match_parent" android:layout_height="match_parent" />
注意點:
- 靜態fragment不能再巢狀fragment;
- 靜態載入一旦新增就不能在執行時刪除;
- 靜態fragment 在onInflate() 中初始化;
- fragment一定要有一個無參構造方法。原因如下:
@Deprecated @NonNull public static Fragment instantiate(@NonNull Context context, @NonNull String fname, @Nullable Bundle args) { //... Class<? extends Fragment> clazz = FragmentFactory.loadFragmentClass( context.getClassLoader(), fname); Fragment f = clazz.getConstructor().newInstance(); if (args != null) { args.setClassLoader(f.getClass().getClassLoader()); f.setArguments(args); } return f; }
Fragment動態使用
Fragment動態使用的操作如下:
- 獲得FragmentManager物件,通過getSupportFragmentManager();
- 獲得FragmentTransaction物件,通過fm.beginTransaction();
- 呼叫add()方法或者repalce()方法載入Fragment;
- 最後呼叫commit()方法提交事務。
使用注意點與常見異常
注意點
- Fragment的onCreateView()方法返回Fragment的UI佈局,需要注意的是inflate()的第三個引數是false;
- 如果在建立Fragment時要傳入引數,必須要通過
setArguments(Bundle bundle)
- 可以在Fragment的onAttach()中通過
getArguments()
獲得傳進來的引數。如果要獲取Activity物件,不建議呼叫getActivity(),而是在onAttach()中將Context物件強轉為Activity物件; commit
方法一定要在Activity.onSaveInstance()
之前呼叫;- FragmentManager擁有回退棧(BackStack)。
異常
getActivity() == null
原因:在網路請求返回資料後,頁面已經關閉時,呼叫getActivity()會返回null。
解決方案: 不建議fragment要使用宿主activity getActivity。
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
Can not perform this action after onSaveInstanceState
解決方案:
a. 不能在onSaveInstanceState之後的生命週期裡面commit fragment ;
b. 不要在子執行緒commit fragment 已經走完onSaveInstanceState。
Fragment重疊
原因:
- 螢幕旋轉 activity 生命週期方法重新執行,而Fragment又具有自我恢復機制,故導致多次添加了該fragment。
不配置 "android:configChanges"時,
a. 豎屏--->橫屏 ---> Activity重新執行1次生命週期
b. 橫屏--->豎屏 ---> Activity重新執行2次生命週期
配置 "android:configChanges"相關屬性後,不會再執行生命週期,只會呼叫onConfigurationChanged()。
2. 系統記憶體不足時會將切換至後臺的app殺死,再次切換到前臺時作恢復處理。
解決方案:
a. 在onSaveInstanceState()中註釋掉super(缺點:activity失去自動儲存的功能)
b. 新增fragment前,先判斷savedInstanceState是否為null
// 新增fragment前,先判斷savedInstanceState是否為null
if (savedInstanceState == null) {
// add fragment
}
來自為知筆記(Wiz)