Android專案開發填坑記-Fragment的onAttach
阿新 • • 發佈:2019-01-30
背景
現在 Android 開發多使用一個 Activity 管理多個 Fragment 進行開發,不免需要兩者相互傳遞資料,一般是給 Fragment 添加回調介面,讓 Activity 繼承並實現。
回撥介面一般都寫在 Fragment 的onAttach()
方法中,Fragment 3.0 的onAttach()
方法有 2 個過載,其中一個被廢棄,所以通常是:
XX_Fragment extends Fragment(Fragment 3.0)
@Override
public void onAttach(Context context) {
if (context instanceof OnCoverChangeListener) {
mListener = (ABC_Listener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement ABC_Listener");
}
super.onAttach(context);
}
但是在一些特定的 Android 版本下,這個onAttach(Context context)
onAttach(Activity activity)
方法。
解決方案
如果使用了 Fragment 3.0,並且用到了自定義回撥,那麼為了相容,需要:
@Override
public void onAttach(Context context) {
if (context instanceof OnCoverChangeListener) {
mListener = (ABC_Listener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement ABC_Listener" );
}
super.onAttach(context);
}
//SDK API<23時,onAttach(Context)不執行,需要使用onAttach(Activity)。Fragment自身的Bug,v4的沒有此問題
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if (activity instanceof OnCoverChangeListener) {
mListener = (ABC_Listener) activity;
} else {
throw new RuntimeException(activity.toString()
+ " must implement ABC_Listener");
}
}
}
總結
建議使用FragmentV4版的,減少不必要的系統自身Bug的處理。
還有一篇關於FragmentV4、Fragment3.0的onBackPressed();
的Bug詳解:
傳送門:Android專案開發填坑記-Fragmen的onBackPressed
PS: