一丶設(shè)計(jì)原理
?????? Android 在 Android 3.0(API 級(jí)別 11)中引入了片段,主要是為了給大屏幕(如平板電腦)上更加動(dòng)態(tài)和靈活的 UI 設(shè)計(jì)提供支持棺克。由于平板電腦的屏幕比手機(jī)屏幕大得多,因此可用于組合和交換 UI 組件的空間更大线定。利用片段實(shí)現(xiàn)此類設(shè)計(jì)時(shí)娜谊,您無需管理對(duì)視圖層次結(jié)構(gòu)的復(fù)雜更改。 通過將 Activity 布局分成片段斤讥,您可以在運(yùn)行時(shí)修改 Activity 的外觀纱皆,并在由 Activity 管理的返回棧中保留這些更改
二丶創(chuàng)建Fragment
1.在 Activity 的布局文件內(nèi)聲明片段
? ?
??? ?中的?android:name?屬性指定要在布局中實(shí)例化的?Fragment?類个曙。
? 必須指定id或者tag闺金,用來標(biāo)識(shí)fragment
2.或者通過編程方式將片段添加到某個(gè)現(xiàn)有?ViewGroup
? ? ? ? ? //獲取FragmentManager實(shí)例
? ? ? ? ? FragmentManager manager = getSupportFragmentManager();
? ? ? ? ? //獲取FragmentTransaction
? ? ? ? ? FragmentTransaction transaction = manager.beginTransaction();
? ? ? ? ? //將fragment1添加至viewGroup(父布局R.id.fragment_contains)
? ? ? ? ? transaction.add(R.id.fragment_contains,fragment1);
? ? ? ? ? //提交事務(wù)
? ? ? ? ? transaction.commit();
- 提示:對(duì)于每個(gè)片段事務(wù)诊霹,您都可以通過在提交前調(diào)用 setTransition() 來應(yīng)用過渡動(dòng)畫奇瘦。
?- 繼承自android.support.v4.app.Fragment
- 傳遞到?add()?的第一個(gè)參數(shù)是?ViewGroup,即應(yīng)該放置片段的位置铝宵,由資源 ID 指定代嗤,第二個(gè)參數(shù)是要添加的片段菱农。
? ? ? ? ? //將fragment1添加至viewGroup,將viewGroup中的所有片段全部移除
? ? ? ? ? transaction.replace(R.id.fragment_contains,fragment2);
? ? ? ? ? //加入回退棧
? ? ? ? ? transaction.addToBackStack(null);
三丶與Activity的通信
1.Fragment->Activity
? -Fragment中調(diào)用Activity
? ? button.setOnClickListener(new View.OnClickListener() {
? ? ? @Override
? ? ? public void onClick(View v) {
? ? ? ? ? ? //fragment中通過getActivity()獲取activity中的控件
? ? ? ? ? ? Log.d("wdl", "onClick: "+ getActivity()
? ? ? ? ? ? ? ? .findViewById(R.id.btn_replace).getId());
? ? ? }
? ? });
-Fragment給Activity傳遞數(shù)據(jù)
? ? Fragment中編寫內(nèi)部接口->在Fragment的onAttach(Activity activity)方法中設(shè)置接口->Activity中實(shí)現(xiàn)接口,方法
? ? 實(shí)現(xiàn)如下:
Fragment中:
? ? ? ? ? private FragListener listener;
? ? ? ? ? public interface FragListener{
? ? ? ? ? ? ? void fragData(String result);
? ? ? ? ? }
? ? ? ? ? @Override
? ? ? ? ? public void onAttach(Context context) {
? ? ? ? ? ? ? super.onAttach(context);
? ? ? ? ? ? ? listener = (FragListener) context;
? ? ? ? ? }
Activity中:
? ? ? ? ? @Override
? ? ? ? ? public void fragData(String result) {
? ? ? ? ? ? ? ? Log.d("wdl", "fragData: "+result);
? ? ? ? ? ? ? ? Toast.makeText(this,result,Toast.LENGTH_SHORT).show();
? ? ? ? ? }
2.Activity->Fragment(通過setArguments(Bundle bundle))
? - Activity中調(diào)用Fragment
? ? ? Fragment1 fragment1 = (Fragment1) getSupportFragmentManager()? ? ? ? ? ? ? ? ? ? .findFragmentById(R.id.fragment_1);
-Activity給Fragment傳遞數(shù)據(jù)
? ? ? --靜態(tài)Fragment
? ? ? Activity中:
? ? ? ? //activity給靜態(tài)加載的fragment傳遞數(shù)據(jù)
? ? ? ? Fragment1 fragment1 = (Fragment1) getSupportFragmentManager()
? ? ? ? ? ? ? ? ? ? .findFragmentById(R.id.fragment_1);
? ? ? ? Bundle bundle = new Bundle();
? ? ? ? bundle.putString("hello_fragment1","我是activity傳來的數(shù)據(jù)");
? ? ? ? fragment1.setArguments(bundle);
Fragment中:
? ? ? ? @Override
? ? ? ? public void onActivityCreated(@Nullable Bundle savedInstanceState) {
? ? ? ? ? ? ? super.onActivityCreated(savedInstanceState);
? ? ? ? ? ? ? Log.d("wdl", "fragment onActivityCreated: ");
? ? ? ? ? ? ? String data = getArguments().getString("hello_fragment1");
? ? ? ? ? ? ? Toast.makeText(getActivity(),data,Toast.LENGTH_SHORT).show();
? ? ? ? }
--非靜態(tài)
Activity中:
? ? ? ? //activity通過setArguments傳遞數(shù)據(jù)給fragment
? ? ? ? Bundle bundle = new Bundle();
? ? ? ? bundle.putString("hello_fragment2","我是activity傳來的數(shù)據(jù)");
? ? ? ? fragment2.setArguments(bundle);
? ? ? ? //獲取FragmentManager實(shí)例
? ? ? ? FragmentManager manager = getSupportFragmentManager();
? ? ? ? //獲取FragmentTransaction
? ? ? ? FragmentTransaction transaction = manager.beginTransaction();
? ? ? ? //將fragment1添加至viewGroup,將viewGroup中的所有片段全部移除
? ? ? ? transaction.replace(R.id.fragment_contains,fragment2);
? ? ? ? //加入回退棧
? ? ? ? transaction.addToBackStack(null);
? ? ? ? //提交事務(wù)
? ? ? ? transaction.commit();
Fragment中:
? ? ? ? getArguments().getString("hello_fragment2");
四丶Fragment的生命周期
? 1.Activity與Fragment生命周期的對(duì)比
2.與Activity生命周期協(xié)調(diào)一致
在片段已與 Activity 關(guān)聯(lián)時(shí)調(diào)用(Activity?傳遞到此方法內(nèi))簸州。?onCreateView()調(diào)用它可創(chuàng)建與片段關(guān)聯(lián)的視圖層次結(jié)構(gòu)钳踊。??onActivityCreated()在 Activity 的?onCreate()?方法已返回時(shí)調(diào)用。??onDestroyView()在移除與片段關(guān)聯(lián)的視圖層次結(jié)構(gòu)時(shí)調(diào)用勿侯。??onDetach()? ? ? ? 在取消片段與 Activity 的關(guān)聯(lián)時(shí)調(diào)用。3.實(shí)踐(在Activity中添加Fragmen通過Log觀察兩者)
分別重寫Activity缴罗。Fragment所有的生命周期方法
進(jìn)入APP:
按Home:
重新進(jìn)入APP:
結(jié)束APP:
5.總結(jié)
??????? - onAttach()?和?onCreate()?只在 Fragment 與 Activity 第一次關(guān)聯(lián)時(shí)調(diào)用助琐。
? ? ? ? -?onDestroy()?和?onDetach()?只在 Fragment 的宿主 Activity 銷毀時(shí)才會(huì)被調(diào)用。
-? 將 Fragment 通過?addToBackStack()?只涉及?onCreateView()?和?onDestroyView()?這之間的生命周期面氓。add()?和?replace()?不會(huì)對(duì) Fragment 的生命周期產(chǎn)生影響兵钮,但?add()?方法會(huì)造成 Fragment 疊加顯示。