Fragments是Android中最基本、最重要的基本概念之一,在開發(fā)過程中經(jīng)常涉及的到,下文是武林技術(shù)頻道小編為您整理的淺析Android Fragment的基本概念,一起進(jìn)入下文了解一下吧!
Fragment
Android是在Android 3.0 (API level 11)開始引入Fragment的。
可以把Fragment想成Activity中的模塊,這個模塊有自己的布局,有自己的生命周期,單獨(dú)處理自己的輸入,在Activity運(yùn)行的時候可以加載或者移除Fragment模塊。
可以把Fragment設(shè)計成可以在多個Activity中復(fù)用的模塊。
當(dāng)開發(fā)的應(yīng)用程序同時適用于平板電腦和手機(jī)時,可以利用Fragment實現(xiàn)靈活的布局,改善用戶體驗。
如圖:
Fragment的生命周期
因為Fragment必須嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相關(guān)的。
如果Activity是暫停狀態(tài),其中所有的Fragment都是暫停狀態(tài);如果Activity是stopped狀態(tài),這個Activity中所有的Fragment都不能被啟動;如果Activity被銷毀,那么它其中的所有Fragment都會被銷毀。
但是,當(dāng)Activity在活動狀態(tài),可以獨(dú)立控制Fragment的狀態(tài),比如加上或者移除Fragment。
當(dāng)這樣進(jìn)行fragment transaction(轉(zhuǎn)換)的時候,可以把fragment放入Activity的back stack中,這樣用戶就可以進(jìn)行返回操作。
Fragment的使用相關(guān)
使用Fragment時,需要繼承Fragment或者Fragment的子類(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代碼看起來和Activity的類似。
使用Support Library
Support Library是一個提供了API庫函數(shù)的JAR文件,這樣就可以在舊版本的Android上使用一些新版本的APIs。
比如android-support-v4.jar.它的完整路徑是:
它就提供了Fragment的APIs,使得在Android 1.6 (API level 4)以上的系統(tǒng)都可以使用Fragment。
為了確定沒有在舊版本系統(tǒng)上使用新版本的APIs,需要如下導(dǎo)入語句:
同時應(yīng)該將上述的包拷入libs項目下的libs文件夾,然后在項目的Properties中添加:右鍵單擊項目,選Properties,左邊選Java Build Path,然后Add External JARs…,添加android-support-v4.jar.
當(dāng)創(chuàng)建包含F(xiàn)ragment的Activity時,如果用的是Support Library,那么繼承的就應(yīng)該是FragmentActivity而不是Activity。
必須實現(xiàn)的三個回調(diào)函數(shù)
onCreate()
系統(tǒng)在創(chuàng)建Fragment的時候調(diào)用這個方法,這里應(yīng)該初始化相關(guān)的組件,一些即便是被暫停或者被停止時依然需要保留的東西。
onCreateView()
當(dāng)?shù)谝淮卫L制Fragment的UI時系統(tǒng)調(diào)用這個方法,必須返回一個View,如果Fragment不提供UI也可以返回null。
注意,如果繼承自ListFragment,onCreateView()默認(rèn)的實現(xiàn)會返回一個ListView,所以不用自己實現(xiàn)。
onPause()
當(dāng)用戶離開Fragment時第一個調(diào)用這個方法,需要提交一些變化,因為用戶很可能不再返回來。
實現(xiàn)Fragment的UI
提供Fragment的UI,必須實現(xiàn)onCreateView()方法。
假設(shè)Fragment的布局設(shè)置寫在example_fragment.xml資源文件中,那么onCreateView()方法可以如下寫:
onCreateView()中container參數(shù)代表該Fragment在Activity中的父控件;savedInstanceState提供了上一個實例的數(shù)據(jù)。
inflate()方法的三個參數(shù):
第一個是resource ID,指明了當(dāng)前的Fragment對應(yīng)的資源文件;
第二個參數(shù)是父容器控件;
第三個布爾值參數(shù)表明是否連接該布局和其父容器控件,在這里的情況設(shè)置為false,因為系統(tǒng)已經(jīng)插入了這個布局到父控件,設(shè)置為true將會產(chǎn)生多余的一個View Group。
把Fragment加入Activity
當(dāng)Fragment被加入Activity中時,它會處在對應(yīng)的View Group中。
Fragment有兩種加載方式:一種是在Activity的layout中使用標(biāo)簽
另外,F(xiàn)ragment它可以并不是Activity布局中的任何一部分,它可以是一個不可見的部分。這部分內(nèi)容先略過。
加載方式1:通過Activity的布局文件將Fragment加入Activity
在Activity的布局文件中,將Fragment作為一個子標(biāo)簽加入即可。
如:
其中android:name屬性填上你自己創(chuàng)建的fragment的完整類名。
當(dāng)系統(tǒng)創(chuàng)建這個Activity的布局文件時,系統(tǒng)會實例化每一個fragment,并且調(diào)用它們的onCreateView()方法,來獲得相應(yīng)fragment的布局,并將返回值插入fragment標(biāo)簽所在的地方。
有三種方法為Fragment提供ID:
android:id屬性:唯一的id
android:tag屬性:唯一的字符串
如果上面兩個都沒提供,系統(tǒng)使用容器view的ID。
加載方式2:通過編程的方式將Fragment加入到一個ViewGroup中
當(dāng)Activity處于Running狀態(tài)下的時候,可以在Activity的布局中動態(tài)地加入Fragment,只需要指定加入這個Fragment的父View Group即可。
首先,需要一個FragmentTransaction實例:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();(注,如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager();)
之后,用add()方法加上Fragment的對象:
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
其中第一個參數(shù)是這個fragment的容器,即父控件組。
最后需要調(diào)用commit()方法使得FragmentTransaction實例的改變生效。
實例
練習(xí)的例子:
寫一個類繼承自Fragment類,并且寫好其布局文件(本例中是兩個TextView),在Fragment類的onCreateView()方法中加入該布局。
之后用兩種方法在Activity中加入這個fragment:
第一種是在Activity的布局文件中加入
第二種是在Activity的代碼中使用FragmentTransaction的add()方法加入fragment。
貼出代碼:
自己定義的fragment類:
fragment的布局文件:
主Activity:
Activity的布局文件:
運(yùn)行結(jié)果如下:
可以看到第二種方式加入fragment的時候,指定了父容器(一個線性布局)的id,其中已經(jīng)有一個Button 3,所以fragment加在其后。
通過武林技術(shù)頻道小編介紹的內(nèi)容,相信大家都有了一定的了解,想要了解更多的技術(shù)內(nèi)容,請繼續(xù)關(guān)注武林技術(shù)頻道吧!
新聞熱點(diǎn)
疑難解答
圖片精選