Fragment用法入門


轉載請標明出處:http://www.cnblogs.com/bkyxdb/p/5993273.html

先講一件自己對Fragment的理解,Fragment可以看成是一個控件,類似於在Activity布局中Button的使用,不過Fragment這個控件功能比較強大,可以在里面放置其他的控件,來滿足使用需要,理解為一個類似布局的容器可能更為合適,只不過這個布局容器由一個單獨的類來支撐,就是對應的Fragment類。就是擁有自己實現類的控件(或布局),可以做很多特別操作。

1、Fragment的創建

創建Fragment類,繼承Fragment,在Fragment類中的onCreateView()方法中綁定對應的Xml布局,類似Activity類中的onCreate()方法

Fragment的布局文件和平時Activity中的沒什么區別,就是你需要向Activity中添加的碎片內容。

需要注意的是,Fragment開始使用是3.0版本,在3.0以下版本使用時,需要導入V4包來支持向下兼容的問題。

2、向Activity中添加Fragment

(1)用Xml布局寫死

創建需要在Activity中加載的Fragment碎片(fragment類),然后在Activity類綁定的布局中用<frament…>方式寫入要加載的Fragment,指定加載的Fragment類是由<fragment…>中的name屬性決定的。這種方法雖然簡單,但也限制了Fragment使用的靈活性和復用,可以視情況而定。

(2)在Activity類中用代碼動態添加

如果是在3.0以下的版本使用Fragment時(需要導入V4包),獲取Fragment管理者的方法是不同的:

在提交之前可以把Fragment添加到回退棧,在你點擊返回鍵時不會直接退出當前Activity,而是返回到之前加載的Fragment

下面這是activity_main.xml中用來動態添加Fragment碎片的容器布局

補充:

1、Fragment常用三個類

  android.app.Fragment 主要用於定義Fragment

  android.app.FragmentManager 主要用於在Activity中操作Fragment

  android.app.FragmentTransaction 保證一些列Fragment操作的原子性

   a、獲取FragmentManage的方式:

    getFragmentManager() // v4中

    getSupportFragmentManager

  b、主要的操作都是FragmentTransaction的方法

    FragmentTransaction transaction = fm.benginTransatcion();//開啟一個事務

 

transaction.add()

  往Activity中添加一個Fragment

transaction.remove()

  從Activity中移除一個Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧后面會詳細說),這個Fragment實例將會被銷毀。

transaction.replace()

  使用另一個Fragment替換當前的,實際上就是remove()然后add()的合體~

transaction.hide()

  隱藏當前的Fragment,僅僅是設為不可見,並不會銷毀

transaction.show()

  顯示之前隱藏的Fragment

detach()

  會將view從UI中移除,和remove()不同,此時fragment的狀態依然由FragmentManager維護。

attach()

  重建view視圖,附加到UI上並顯示。

transatcion.commit()

  //提交一個事務

 

注意:常用Fragment的哥們,可能會經常遇到這樣Activity狀態不一致:State loss這樣的錯誤。主要是因為:commit方法一定要在Activity.onSaveInstance()之前調用。

 

值得注意的是:如果你喜歡使用Fragment,一定要清楚這些方法,哪個會銷毀視圖,哪個會銷毀實例,哪個僅僅只是隱藏,這樣才能更好的使用它們。

a、比如:我在FragmentA中的EditText填了一些數據,當切換到FragmentB時,如果希望回到A還能看到數據,則適合你的就是hide和show;也就是說,希望保留用戶操作的面板,你可以使用hide和show,當然了不要使勁在那new實例,進行下非null判斷。

b、再比如:我不希望保留用戶操作,你可以使用remove(),然后add();或者使用replace()這個和remove,add是相同的效果。

c、remove和detach有一點細微的區別,在不考慮回退棧的情況下,remove會銷毀整個Fragment實例,而detach則只是銷毀其視圖結構,實例並不會被銷毀。那么二者怎么取舍使用呢?如果你的當前Activity一直存在,那么在不希望保留用戶操作的時候,你可以優先使用detach。

 

個人學習總結,錯誤不足之處請大家指出補充。

 

 資料參考:http://blog.csdn.net/lmj623565791/article/details/37970961


免責聲明!

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



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