碎片是一種可以嵌入在活動(dòng)中的UI片段,能讓程序更加合理和充分地利用大屏幕的空間,因此在平板中應(yīng)用的很廣泛.碎片(fragment)和活動(dòng)很像,同樣都能包含布局,同樣都有自己的聲明周期.
平板中的新聞標(biāo)題列表界面和新聞詳細(xì)內(nèi)容界面分別放在兩個(gè)碎片中,然后在同一個(gè)活動(dòng)里引入這兩個(gè)碎片,這樣就可以將這個(gè)屏幕空間充分的利用起來(lái)了.
如果在模擬碎片看其UI時(shí)還是建議使用平板,因?yàn)槭謾C(jī)可能現(xiàn)象不是很明顯.需要我們創(chuàng)建一個(gè)平板模擬器.
碎片的簡(jiǎn)單應(yīng)用
碎片在用法中和activity沒(méi)有什么太大的區(qū)別,都是新建布局文件,給布局中的有關(guān)控件設(shè)置id,不同之處在于:fragment需要新建一個(gè)類(lèi)而不是activity,如新建一個(gè)leftfragment類(lèi)讓它繼承Fragment(注意在繼承Fragment中選擇的Fragment是support-v4庫(kù)中的Fragment,因?yàn)檫@樣可以讓碎片在所有的Android系統(tǒng)版本中功能保持一致,否則程序很容易崩潰)
在新建的leftfragment類(lèi)中需要我們重寫(xiě)onCreatView(LayoutInflater inflater)方法,在這個(gè)方法中通過(guò)LayoutInflater的inflater()方法將剛才定義的布局動(dòng)態(tài)加載起來(lái).
接下來(lái)修改要將填入frgment的相應(yīng)的activity的布局文件,注意該布局文件中和普通activity中的布局文件基本一致,只是在某些方面存在不同,使用<fragment >標(biāo)簽在布局中添加碎片, <fragment/>標(biāo)簽中的android:name屬性來(lái)顯示指明要添加的碎片類(lèi)名,注意一定要將類(lèi)的包名也加上.
動(dòng)態(tài)添加碎片
碎片的真正強(qiáng)大之處在于可以在程序運(yùn)行過(guò)程中動(dòng)態(tài)地添加到活動(dòng)中.
動(dòng)態(tài)添加碎片主要分為5步:
1.創(chuàng)建添加碎片的實(shí)例
2.獲取FragmentManager,在活動(dòng)中可以直接通過(guò)調(diào)用getSupportFragmentManager()方法得到
3.開(kāi)啟一個(gè)事務(wù),通過(guò)調(diào)用beginTransaction()方法開(kāi)啟
4.向容器中添加或替換碎片,一般采用replace()方法來(lái)實(shí)現(xiàn),需要傳入容器的id和待添加的碎片實(shí)例
5.提交事務(wù),通過(guò)提交commit()方法來(lái)完成.
private void replaceFragment(Fragment fragment){ //首先獲得FragmentManager FragmentManager fragmentManager=getSupportFragmentManager(); //通過(guò)beginTransaction()開(kāi)始事務(wù) FragmentTransaction transaction=fragmentManager.beginTransaction(); //向容器中添加或替換碎片 transaction.replace(R.id.right_layout,fragment); //模擬返回棧的效果,即按下Back鍵可以回到上一個(gè)碎片 transaction.addToBackStack(null); //提交事務(wù) transaction.commit(); }
在碎片中模擬返回棧即按下back鍵可以返回上一個(gè)碎片可以使用FragmentTransaction提供的addToBackStack()方法,可以用于將事務(wù)添加到返回棧中.方法中的參數(shù)通常傳入null即可
碎片和互動(dòng)之間的通信
為了方便碎片和活動(dòng)通信:
FragmentManager提供了一個(gè)類(lèi)似于findViewById()的方法專(zhuān)門(mén)用于從布局文件中獲取碎片的實(shí)例.
RightFragment rightFragment=(RightFragment) getFragmentManager() .findFragmentById(R.id.right_fragment);
調(diào)用FragmentManager的findViewById()方法,可以從活動(dòng)中得到相應(yīng)的碎片的實(shí)例,然后就能輕松的調(diào)用碎片里的方法了.
碎片中調(diào)用activity的方法,每個(gè)碎片都可以通過(guò)調(diào)用getActivity()方法來(lái)得到和當(dāng)前碎片相關(guān)聯(lián)的活動(dòng)實(shí)例.
MainActivity activity=(MainActivity) getActivity()
有了活動(dòng)實(shí)例之后,在碎片中調(diào)用活動(dòng)里的方法便變得輕而易舉了.當(dāng)碎片中需要使用Context對(duì)象時(shí),也可以使用getActivity()方法,因?yàn)楂@取到的活動(dòng)本身就是一個(gè)Context對(duì)象.
碎片和碎片之間通信:首先一個(gè)碎片得到與它關(guān)聯(lián)的活動(dòng),然后通過(guò)活動(dòng)去獲取另外一個(gè)碎片的實(shí)例,這樣便實(shí)現(xiàn)了不同碎片之間的通信功能.
碎片的生命周期
碎片和活動(dòng)內(nèi)狀態(tài)一樣都是有運(yùn)行狀態(tài),暫停狀態(tài),停止?fàn)顟B(tài)和銷(xiāo)毀狀態(tài)
其回調(diào)方法除了有跟activity一樣的方法之外還有其獨(dú)特的方法比如:
onAttach()。當(dāng)碎片和活動(dòng)建立關(guān)聯(lián)的時(shí)候調(diào)用。
onCreateView()。為碎片創(chuàng)建視圖(加載布局)時(shí)調(diào)用。
onActivityCreated()。確保與碎片相關(guān)聯(lián)的活動(dòng)一定已經(jīng)創(chuàng)建完畢的時(shí)候調(diào)用。
onDestroyView()。當(dāng)與碎片關(guān)聯(lián)的視圖被移除的時(shí)候調(diào)用。
onDetach()。當(dāng)碎片和活動(dòng)解除關(guān)聯(lián)的時(shí)候調(diào)用。

動(dòng)態(tài)加載布局的技巧
使用限定符
使用最小寬度限定符