1. 要深刻理解Fragment 的生命周期
2. Fragment.getActivity()並不能保證非空。
3.如果在Fragment中有異步的回調, 特別要注意此時Fragment 是否還attached 在Activity中,可以調用isVisible()來判斷
4. Layout 中添加fragment 與代碼中添加Fragment 的區別:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@+id/register_container" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <!----> 8 <fragment 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 class="com.xxx.xxxx.fragment.RegisterBasicInfoFragment" /> 12 13 14 15 </LinearLayout>
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 this.setContentView(R.layout.register); 5 6 FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 7 RegisterBasicInfoFragment bf = new RegisterBasicInfoFragment(); 8 9 ft.replace(R.id.register_container, bf).commit(); 10 }
前者,register_container 被replace 成另外一個Fragment的時候,舊的Fragment不會走銷毀流程onPause->onStop->onDetroyView;
但是后者,會走銷毀流程。
5. 需要傳入參數的Fragment, 要用靜態的newInstance(.....)方式來獲得實例,而不要直接new, 然后用setXXX 的方式。
1 public static RegisterDetailInfoFragment newInstance(String userName, String password) { 2 RegisterDetailInfoFragment f = new RegisterDetailInfoFragment(); 3 Bundle args = new Bundle(); 4 args.putString("userName", userName); 5 args.putString("password", password);
f.setArguments(args);
6 return f; 7 }
你可能會說,為啥不直接用有參數的構造函數呢?原因是,某些情況,Fragment 要重新構建,系統不會認識的有參數的構造函數,只會調用默認無參構造函數;而用靜態newInstance這種方式,你要在里面把參數放到setArguments當中,系統在onSavedInstanceState的時候,會把你的參數持久化,重建的時候,參數值就不會丟失了。