碎片(Fragment)是一種可以嵌入在活動(dòng)當(dāng)中的UI片段迈着,它能讓程序更加合理和充分地利用大屏幕的空間彼念,因而在平板上應(yīng)用廣泛狞尔。
fragment也含有4種狀態(tài):
運(yùn)行狀態(tài):
- 當(dāng)一個(gè)碎片可見(jiàn)的斯议,并且它所關(guān)聯(lián)的活動(dòng)正處于運(yùn)行狀態(tài)時(shí)撒轮,該碎片也處于運(yùn)行狀態(tài)乞旦。
暫停狀態(tài):
- 當(dāng)一個(gè)活動(dòng)進(jìn)入暫停狀態(tài)時(shí)(由于另一個(gè)未占滿屏幕的活動(dòng)被添加到了棧頂),與它相關(guān)的可見(jiàn)碎片進(jìn)入停止?fàn)顟B(tài)题山。
停止?fàn)顟B(tài):
- 當(dāng)一個(gè)活動(dòng)進(jìn)入停止?fàn)顟B(tài)時(shí)兰粉,與它相關(guān)聯(lián)的碎片就會(huì)進(jìn)入到停止?fàn)顟B(tài)
- 通過(guò)調(diào)用FragmentTransaction的remove()、replace()方法將碎片從活動(dòng)中移除顶瞳,如果我們?cè)谑挛锾峤恢罢{(diào)用了addToBackStack()方法玖姑,這時(shí)的碎片也會(huì)進(jìn)入到停止?fàn)顟B(tài)愕秫。
總的來(lái)說(shuō),碎片的停止?fàn)顟B(tài)和活動(dòng)的差不多對(duì)用戶不可見(jiàn)焰络、可能被系統(tǒng)回收戴甩。
銷毀狀態(tài)
- 當(dāng)一個(gè)活動(dòng)被銷毀時(shí),與它相關(guān)的碎片也進(jìn)入銷毀狀態(tài)
- 通過(guò)調(diào)用FragmentTransaction的remove()闪彼、replace()方法將碎片從活動(dòng)中移除甜孤,如果我們?cè)谑挛锾峤恢皼](méi)有調(diào)用addToBackStack()方法,這時(shí)的碎片就會(huì)進(jìn)入到銷毀狀態(tài)畏腕。
回調(diào)方法
碎片的回調(diào)大部分與活動(dòng)的差不多缴川,其中不同的是:
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)用流昏。
使用限定符
我們可以在res文件下新建一個(gè)layout文件夾扎即,例:
這里我們使用的是最小寬度限定符,其他的限定符見(jiàn)圖:
使用了限定符后况凉,Android系統(tǒng)會(huì)根據(jù)你的手機(jī)的分辨率自動(dòng)讀取相應(yīng)的限定符layout。
簡(jiǎn)單的使用碎片:
- 寫(xiě)一個(gè)Fragment
public class NewFragment extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.new_frag,container,false); return view;
}
}
- 寫(xiě)layout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/new_fragment"
android:name="soft.wc.com.fragmentbestpractice.fragment.NewFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
好了各拷,我們使用了<fragment>標(biāo)簽在布局中添加碎片刁绒,其中需要注意的就是我們使用了name屬性來(lái)顯示指明要添加的碎片類名(一定要把類的包名加上)。
動(dòng)態(tài)的添加碎片
碎片的強(qiáng)大之處在于烤黍,它可以在程序運(yùn)行時(shí)動(dòng)態(tài)地添加到活動(dòng)中知市。
例:
NewFragment newFragment = new NewFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.news_content_layout,newFragment);
fragmentTransaction.commit();
動(dòng)態(tài)添加碎片的步驟:
- 創(chuàng)建待添加的碎片實(shí)例;
- 獲取FragmentManager速蕊,在活動(dòng)中可以直接通過(guò)調(diào)用
getSupportFragmentManager()
方法得到嫂丙; - 開(kāi)啟一個(gè)事物,通過(guò)調(diào)用
beginTransaction()
方法開(kāi)啟规哲; - 向容器內(nèi)添加或替換碎片跟啤,一般使用
replace()
方法實(shí)現(xiàn),需要傳入容 器的id和待添加的碎片實(shí)例唉锌; - 提交事物隅肥,調(diào)用
commit()
方法來(lái)完成。
Fragment可能會(huì)有兩個(gè)不同包下的Fragment供你選擇袄简,一個(gè)是系統(tǒng)內(nèi)置的android.app.Fragment腥放,一個(gè)是support-v4庫(kù)中android.support.v4.app.Fragment。這里建議使用support-v4庫(kù)中的绿语,因?yàn)樗梢宰屗槠谒蠥ndroid系統(tǒng)版本中保持功能一致性秃症。