一丶設(shè)計原理
?????? Android 在 Android 3.0(API 級別 11)中引入了片段,主要是為了給大屏幕(如平板電腦)上更加動態(tài)和靈活的 UI 設(shè)計提供支持。由于平板電腦的屏幕比手機屏幕大得多,因此可用于組合和交換 UI 組件的空間更大。利用片段實現(xiàn)此類設(shè)計時,您無需管理對視圖層次結(jié)構(gòu)的復(fù)雜更改。 通過將 Activity 布局分成片段,您可以在運行時修改 Activity 的外觀,并在由 Activity 管理的返回棧中保留這些更改
二丶創(chuàng)建Fragment
1.在 Activity 的布局文件內(nèi)聲明片段
? ?
??? ?中的?android:name?屬性指定要在布局中實例化的?Fragment?類。
? 必須指定id或者tag,用來標(biāo)識fragment
2.或者通過編程方式將片段添加到某個現(xiàn)有?ViewGroup
? ? ? ? ? //獲取FragmentManager實例
? ? ? ? ? FragmentManager manager = getSupportFragmentManager();
? ? ? ? ? //獲取FragmentTransaction
? ? ? ? ? FragmentTransaction transaction = manager.beginTransaction();
? ? ? ? ? //將fragment1添加至viewGroup(父布局R.id.fragment_contains)
? ? ? ? ? transaction.add(R.id.fragment_contains,fragment1);
? ? ? ? ? //提交事務(wù)
? ? ? ? ? transaction.commit();
- 提示:對于每個片段事務(wù),您都可以通過在提交前調(diào)用 setTransition() 來應(yīng)用過渡動畫。
?- 繼承自android.support.v4.app.Fragment
- 傳遞到?add()?的第一個參數(shù)是?ViewGroup,即應(yīng)該放置片段的位置,由資源 ID 指定,第二個參數(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中實現(xiàn)接口,方法
? ? 實現(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實例
? ? ? ? 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生命周期的對比
2.與Activity生命周期協(xié)調(diào)一致
在片段已與 Activity 關(guān)聯(lián)時調(diào)用(Activity?傳遞到此方法內(nèi))。?onCreateView()調(diào)用它可創(chuàng)建與片段關(guān)聯(lián)的視圖層次結(jié)構(gòu)。??onActivityCreated()在 Activity 的?onCreate()?方法已返回時調(diào)用。??onDestroyView()在移除與片段關(guān)聯(lián)的視圖層次結(jié)構(gòu)時調(diào)用。??onDetach()? ? ? ? 在取消片段與 Activity 的關(guān)聯(lián)時調(diào)用。3.實踐(在Activity中添加Fragmen通過Log觀察兩者)
分別重寫Activity。Fragment所有的生命周期方法
進(jìn)入APP:
按Home:
重新進(jìn)入APP:
結(jié)束APP:
5.總結(jié)
??????? - onAttach()?和?onCreate()?只在 Fragment 與 Activity 第一次關(guān)聯(lián)時調(diào)用。
? ? ? ? -?onDestroy()?和?onDetach()?只在 Fragment 的宿主 Activity 銷毀時才會被調(diào)用。
-? 將 Fragment 通過?addToBackStack()?只涉及?onCreateView()?和?onDestroyView()?這之間的生命周期。add()?和?replace()?不會對 Fragment 的生命周期產(chǎn)生影響,但?add()?方法會造成 Fragment 疊加顯示。
