Fragment 使用總結


 

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的時候,會把你的參數持久化,重建的時候,參數值就不會丟失了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM