Android中Fragment生命周期和基本用法


1.基本概念

1. Fragment是什么?

Fragment是可以讓你的app縱享絲滑的設計,如果你的app想在現在基礎上性能大幅度提高,並且占用內存降低,同樣的界面Activity占用內存比Fragment要多,響應速度Fragment比Activty在中低端手機上快了很多,甚至能達到好幾倍!如果你的app當前或以后有移植平板等平台時,可以讓你節省大量時間和精力。

下圖是文檔中給出的一個Fragment分別對應手機與平板間不同情況的處理圖:

2. Fragment優點

  • Fragment可以使你可以將activity分離成多個可以重用的組件,每個都有它自己的生命周期和UI。
  • Fragment可以輕松的創建動態靈活的UI設計,可以適用於不同的屏幕尺寸。從手機到平板電腦
  • Fragment是一個獨立的模塊,緊緊地與activity綁定在一起。可以運行中動態地移除、加入、交換等。
  • Fragment提供一個新的方式讓你在不同的安卓設備上統一你的UI。
  • Fragment 解決Activity間的切換不流暢,輕量切換。
  • Fragment 替代TabActivity做導航,性能更好。
  • Fragment 在4.2.版本中新增嵌套fragment使用方法,能夠生成更好的界面效果。
  • Fragment做局部內容更新更方便,原來為了到達這一點要把多個布局放到一個activity里面,現在可以用多Fragment來代替,只有在需要的時候才加載Fragment,提高性能

3.Fragment的生命周期圖

具體回調方法:


onAttach:onAttach()在fragment與Activity關聯之后調調查用。需要注意的是,初始化fragment參數可以從getArguments()獲得,但是,當Fragment附加到Activity之后,就無法再調用setArguments()。所以除了在最開始時,其它時間都無法向初始化參數添加內容。

onCreate:fragment初次創建時調用。盡管它看起來像是Activity的OnCreate()函數,但這個只是用來創建Fragment的。此時的Activity還沒有創建完成,因為我們的Fragment也是Activity創建的一部分。所以如果你想在這里使用Activity中的一些資源,將會獲取不到。比如:獲取同一個Activity中其它Frament的控件實例。(代碼如下:),如果想要獲得Activity相關聯的資源,必須在onActivityCreated中獲取。

onCreateView:在這個fragment構造它的用戶接口視圖(即布局)時調用。

onActivityCreated:在Activity的OnCreate()結束后,會調用此方法。所以到這里的時候,Activity已經創建完成!在這個函數中才可以使用Activity的所有資源。如果把下面的代碼放在這里,獲取到的btn_Try的值將不會再是空的!

onStart:當到OnStart()時,Fragment對用戶就是可見的了。但用戶還未開始與Fragment交互。在生命周期中也可以看到Fragment的OnStart()過程與Activity的OnStart()過程是綁定的。意義即是一樣的。以前你寫在Activity的OnStart()中來處理的代碼,用Fragment來實現時,依然可以放在OnStart()中來處理。

onResume:當這個fragment對用戶可見並且正在運行時調用。這是Fragment與用戶交互之前的最后一個回調。從生命周期對比中,可以看到,Fragment的OnResume與Activity的OnResume是相互綁定的,意義是一樣的。它依賴於包含它的activity的Activity.onResume。當OnResume()結束后,就可以正式與用戶交互了。

onPause:此回調與Activity的OnPause()相綁定,與Activity的OnPause()意義一樣。

onStop:這個回調與Activity的OnStop()相綁定,意義一樣。已停止的Fragment可以直接返回到OnStart()回調,然后調用OnResume()。

onDestroyView:如果Fragment即將被結束或保存,那么撤銷方向上的下一個回調將是onDestoryView()。會將在onCreateView創建的視圖與這個fragment分離。下次這個fragment若要顯示,那么將會創建新視圖。這會在onStop之后和onDestroy之前調用。這個方法的調用同onCreateView是否返回非null視圖無關。它會潛在的在這個視圖狀態被保存之后以及它被它的父視圖回收之前調用。

onDestroy:當這個fragment不再使用時調用。需要注意的是,它即使經過了onDestroy()階段,但仍然能從Activity中找到,因為它還沒有Detach。

onDetach:Fragment生命周期中最后一個回調是onDetach()。調用它以后,Fragment就不再與Activity相綁定,它也不再擁有視圖層次結構,它的所有資源都將被釋放。

2.創建一個Fragment

1.靜態加載Fragment

實現流程:

  1. 定義Fragment的xml布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:background="#00ff00" >    
    
    <TextView    
        android:layout_width="wrap_content"    
        android:layout_height="wrap_content"    
        android:text="This is fragment 1"    
        android:textColor="#000000"    
        android:textSize="25sp" />    
    
</LinearLayout> 
  1. 自定義Fragment類,需要繼承Fragment類或者其子類,同時實現onCreateView()方法。在方法中,通過inflater.inflate加載布局文件,接着返回view即可
public class Fragmentone extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment1, container,false);
        return view;
    }   
}
  1. 在需要加載Fragment的Activity對應的布局文件中fragment的name屬性需要為全限定類名,即包名.fragment 例如:com.jay.example.fragment1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:baselineAligned="false" >  
  
    <fragment  
        android:id="@+id/fragment1"  
        android:name="com.harvic.com.harvicblog2.Fragment1"  
        android:layout_width="0dip"  
        android:layout_height="match_parent"  
        android:layout_weight="1" />  
  
    <fragment  
        android:id="@+id/fragment2"  
        android:name="com.harvic.com.harvicblog2.Fragment2"  
        android:layout_width="0dip"  
        android:layout_height="match_parent"  
        android:layout_weight="1" />  
  
</LinearLayout>  
  1. Activity調用setContentView()加載布局文件即可
public class MainActivity extends FragmentActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
    }  
}

2.動態加載Fragment

實現流程:

  1. 獲取FragmentManager對象,通過getFragmentManager();

  2. 獲取FragmentTransaction對象,通過 fragment.beginTransaction();

  3. 調用add()方法或者replace()方法加載Fragment;add(要傳入的容器,fragment對象)

  4. 在前面的基礎上還需要調用commit()方法提交事物,當然還有其他的方法,例如remove。

操作步驟:
將activity_main.xml文件改成

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:baselineAligned="false" >  
  
    <Button  
        android:id="@+id/btn_show_fragment1"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="顯示Fragment1"/>  
  
    <Button  
        android:id="@+id/btn_show_fragment2"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:text="顯示Fragment2"/>  
  
    <FrameLayout  
        android:id="@+id/fragment_container"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"/>  
  
</LinearLayout> 

主界面上有兩個按鈕和一個FrameLayout布局。這兩個按鈕分別用來在這個FrameLayout加載Fragment1和Fragment2的實例。效果如下:


其它代碼都沒有動,主要的是在MainActivity里,點擊這兩個按鈕時做的處理

public class MainActivity extends FragmentActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        Button btnLoadFrag1 = (Button)findViewById(R.id.btn_show_fragment1);  
        btnLoadFrag1.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                FragmentManager manager = getSupportFragmentManager();  
                FragmentTransaction transaction = manager.beginTransaction();  
                Fragment1 fragment1 = new Fragment1();  
                transaction.add(R.id.fragment_container, fragment1);  
                transaction.commit();  
            }  
        });  
  
        Button btnLoagFrag2 = (Button)findViewById(R.id.btn_show_fragment2);  
        btnLoagFrag2.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                FragmentManager manager = getSupportFragmentManager();  
                FragmentTransaction transaction = manager.beginTransaction();  
                Fragment2 fragment2 = new Fragment2();  
                transaction.add(R.id.fragment_container, fragment2);  
                transaction.commit();  
            }  
        });  
    }  
}  

在點擊按鈕時都做了類似的操作:

FragmentManager manager = getSupportFragmentManager();  
FragmentTransaction transaction = manager.beginTransaction();  
Fragment1 fragment1 = new Fragment1();  
transaction.add(R.id.fragment_container, fragment1);  
transaction.commit();  

動態添加Fragment主要分為4步:
1.獲取到FragmentManager,在V4包中通過getSupportFragmentManager,在系統中原生的Fragment是通過getFragmentManager獲得的。
2.開啟一個事務,通過調用beginTransaction方法開啟。
3.向容器內加入Fragment,一般使用add或者replace方法實現,需要傳入容器的id和Fragment的實例。
4.提交事務,調用commit方法提交。

資料參考


免責聲明!

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



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