1. 程式人生 > 實用技巧 >技術基礎 | Stargate入門

技術基礎 | Stargate入門

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新增帶引數的建構函式;
  • 可以在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重疊

原因:

  1. 螢幕旋轉 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)