本來是打算一周至少寫兩篇博客的,但是這周無奈亂七八糟的事兒太多,今天總算是找了個(gè)時(shí)間來寫一篇博客。就記錄下平時(shí)沒怎用的Fragment的使用吧。作為一個(gè)菜鳥級(jí)的android開發(fā),在目前做的實(shí)驗(yàn)室的項(xiàng)目都比較小,為了簡(jiǎn)單就統(tǒng)統(tǒng)只使用Activity,F(xiàn)ragment基本上沒有用過,所以寫了這篇文章記錄下學(xué)習(xí)過程,熟悉鞏固一下它的用法。
什么是Fragment
Fragment,簡(jiǎn)單的中文翻譯就是碎片的意思,在進(jìn)一步說就是UI當(dāng)中的碎片。就我自己的理解其實(shí)就相對(duì)于是一個(gè)小型的Activity,因?yàn)樵贏ctivity中能夠?qū)崿F(xiàn)的東西它也可以,但是它必須存在于一個(gè)Activity中。Fragment最開始出現(xiàn)的時(shí)候主要應(yīng)用于平板系統(tǒng)中,因?yàn)槠桨宓钠聊槐容^大,如果一個(gè)界面都用activity加載的一個(gè)布局去展示的話,一方面是會(huì)不好看,浪費(fèi)空間,另一方面也不方便管理維護(hù)。所以將界面分成幾個(gè)小的部分,而每個(gè)部分就是一個(gè)fragment,因此在我看來fragment就是一個(gè)小型的activity。
既然Fragment是一個(gè)小型的Activity,那他應(yīng)該也有生命周期了,也存在一個(gè)create到resume到destroy的過程,關(guān)于它的生命周期以及與Activity生命周期的關(guān)系,在這里先就不說了,網(wǎng)上的資料一大堆,以后有時(shí)間的話也會(huì)來補(bǔ)充上
Fragment的使用
fragment的使用主要分為兩個(gè)部分,第一個(gè)如何去創(chuàng)建一個(gè)fragment,第二個(gè)如何把fragment放在activity中
1.如何創(chuàng)建一個(gè)fragment
上面說了fragment就是一個(gè)小的activity,所以它的創(chuàng)建過程其實(shí)和activity相似,首先新建一個(gè)布局文件,假設(shè)創(chuàng)建了一個(gè)fragment_layout.xml文件,然后新建一個(gè)MyFragment類文件,讓該類繼承Fragment類(一般選擇support-v4包中的Fragment,因?yàn)榧嫒菪詮?qiáng)),接下來就可以像activity去加載布局xml文件一下重寫onCreateView方法去加載布局,如下所示:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_layout,container,false);
return view;
}
到這一步就成功創(chuàng)建了一個(gè)自定義的Fragment,就是這么easy
2. 如何把Fragment添加到Activity中
因?yàn)閒ragment必須存在activity中,所以創(chuàng)建了一個(gè)activity中還沒辦法將它展現(xiàn)出來,必須添加到相應(yīng)的activity中。而這一過程有兩種方式,包括靜態(tài)添加和動(dòng)態(tài)添加
靜態(tài)添加
靜態(tài)添加就是在activity對(duì)應(yīng)要加載的布局xml布局文件中通過fragment標(biāo)簽直接把fragment引入在相應(yīng)位置。如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/my_fragment"
android:name="com.example.tu.fragmenttest.MyFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
這樣當(dāng)該布局xml對(duì)應(yīng)的activity可見的時(shí)候,MyFragment就會(huì)展示出來,所以這種方式也很easy
動(dòng)態(tài)添加
所謂的動(dòng)態(tài)添加就是在Activity啟動(dòng)之后動(dòng)態(tài)加入。這種方式比起前面的靜態(tài)方式稍微復(fù)雜一點(diǎn)點(diǎn),但是這種方式更實(shí)用,因?yàn)檫@樣可以隨時(shí)控制activity的添加,替換,刪除等動(dòng)作。
動(dòng)態(tài)添加方式需要首先在布局xml文件中用ViewGroup控件給fragment預(yù)留一個(gè)位置,然后就需要借助FragmentManager來將fragment放置到該位置中,動(dòng)態(tài)添加的步驟為:
- 創(chuàng)建自定義Fragment的實(shí)例,即new一個(gè)自定義的Fragment;
- 獲取FragmentManager的實(shí)例,一般可直接通過getFragmentManager獲取到,若是使用的support-v4包下的Fragment,則需要通過getSupportFragmentManager獲?。?/li>
- 通過FragmentManager實(shí)例的beginTransaction方法開啟得到FragmentTranscation的實(shí)例,即開啟一個(gè)事務(wù)(注意FragmentTranscation的實(shí)例只能使用一次,后續(xù)有需要?jiǎng)討B(tài)操作fragment的時(shí)候則需要重新開啟一個(gè)新的實(shí)例);
- 事務(wù)提供了add方法,可將fragment添加進(jìn)來,add方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是需要放置的布局id,第二個(gè)參數(shù)則是上面new出來的fragment實(shí)例。類似的事務(wù)還提供了replace,remove等方法都是用來動(dòng)態(tài)操作fragment的;
- 上面的事務(wù)將所要完成的工作都準(zhǔn)備好了,最后的工作就是將這個(gè)事務(wù)提交即調(diào)用commit()方法,以實(shí)現(xiàn)效果。
Example
MyFragment myFragment = new MyFragment();
FragmentManager mfragmentManger = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = mfragmentManger.beginTransaction();
fragmentTransaction.add(R.id.fragment_frame,myFragment);
fragmentTransaction.commit();
總結(jié)
本文目前只是對(duì)Fragment最基本的使用方法做了一個(gè)簡(jiǎn)單的介紹,后面還會(huì)針對(duì)fragment的使用細(xì)節(jié)等進(jìn)行補(bǔ)充,也會(huì)記錄一些Fragment的應(yīng)用,比如類似微信app底部的導(dǎo)航欄。
菜鳥一枚,寫的不好,還在努力進(jìn)步中,如果有任何建議歡迎提出
2017 4.1 23:58
806實(shí)驗(yàn)室