Fragment是什么?
Fragment(片段,碎片)在3.0以后出現(xiàn),主要是為了在大屏幕設(shè)備上支持動(dòng)態(tài)的和更靈活的UI設(shè)計(jì)(眾所周知android 3.0只轉(zhuǎn)為平板電腦設(shè)計(jì),屏幕顯示方面跟手機(jī)相比差異比較大)。為了適應(yīng)大屏幕設(shè)備上面視圖的轉(zhuǎn)換所以設(shè)計(jì)了fragment。

fragments.png
從上圖可以看出一個(gè)Activity中可以有多個(gè)Fragment,一個(gè)Fragment可以被多個(gè)Activity使用
Fragment必須顯示在Activity中
Fragment生命周期

fragment_lifecycle.png
因?yàn)镕ragment依存于Activity所以當(dāng)Activity生命周期結(jié)束時(shí)Fragment生命周期也會(huì)結(jié)束
1,初始化階段 4個(gè)
onAttach() 與歸屬Activity建立連接
onCreate() 初始化Fragment
onCreateView() 初始化Fragment中顯示的UI布局
onActivityCreatde() 歸屬Activity的onCreate()方法執(zhí)行完成
2, 顯示/隱藏 4個(gè)
onStart() 顯示Fragment
onResume() 獲得用戶焦點(diǎn)
onPause() 失去用戶焦點(diǎn)
onStop() 關(guān)閉Fragment
3, 銷毀階段 3個(gè)
onDestroyView() 銷毀Fragment顯示的UI布局
onDestroy() 銷毀Fragment
onDetach() 與歸屬Activity斷開(kāi)連接
靜態(tài)方式:
顯示: F:onAttach -- F:onCreate -- F:onCreateView -- M:onCreate -- F:onActivityCreated -- M:onStar -- F:onStrar -- M:onResume -- F:onResume
退出: F:onPause -- M:onPause -- F:onStop -- M:onStop -- F:onDestroyView -- F:onDestroy -- F:ondetach -- M:onDestroy
動(dòng)態(tài)方式:
顯示: M:onCrate -- F:onAttach -- F:onCreate -- F:onCreateView --F:onActivityCreated -- M:onStar -- F:onStrar -- M:onResume -- F:onResume
退出: F:onPause -- M:onPause -- F:onStop -- M:onStop -- F:onDestroyView -- F:onDestroy -- F:ondetach -- M:onDestroy
如何創(chuàng)建Fragment
- 定義一個(gè)類繼承Fragment
public classMyFragment extends Fragment{} - 重寫父類的生命周期的方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, null);//fragment為自定義要顯示的布局
return view;
}
Fragment的顯示方式
- 靜態(tài)顯示(固定內(nèi)容,不需要接受數(shù)據(jù))
1.在Activity要顯示的布局文件中通過(guò)<fragment/>標(biāo)簽引入
2.在標(biāo)簽中需指定id,用來(lái)標(biāo)識(shí)Fragment的唯一性(因?yàn)橐粋€(gè)Activity可以有多個(gè)Fragment)
3.在標(biāo)簽中指定name屬性,指定要顯示的Fragment(屬性值為包名.類名) - 動(dòng)態(tài)顯示
1.在顯示的布局頁(yè)面中,通過(guò)布局容器占位
2.在Activity中得到Fragment管理器對(duì)象
FragmentManager manager = getFragmentManager();
3.開(kāi)啟一個(gè)事務(wù)
FragmentTransaction transaction = manager.beginTransaction();
4.動(dòng)態(tài)顯示Fragment
transaction.replace(R.id.layout1, new Left_Fragment());
5.提交事務(wù)
transaction.commit(); - tansaction方法
替換 replace
移除 remove
添加 add
隱藏 hide
顯示 show
transaction.addToBackStack(null);//將當(dāng)前的Fragment加入到回退棧中
Fragment傳值
- Activity向Fragment傳值
Activity中
Bundle bundle = new Bundle();
bundle.putString(key,value);
fragment.setArguments(bundle);
Fragment中
Bundle bundle = getArguments();
String key = bundle.getString(key); - Fragment向Activity傳值(接口回調(diào))
Fragment中
public void getEditText(CallBack callBack)
{
String msg = et.getText().toString().trim();
callBack.sendResult(msg);
}
//回調(diào)接口
public interface CallBack
{
public void sendResult(String result);
}
Activity中
fragment.getEditText(new CallBack() {
@Override
public void sendResult(String result) {
tv.setText(result);
}
}); - Fragment向Fragment傳值
LeftFragment :
//傳值
RightFragment fragment = new RightFragment();
Bundle args = new Bundle();
args.putString("name", data.get(position));
fragment.setArguments(args);
RightFragment:
//取值
Bundle bundle = getArguments();
String name = bundle.getString("name");