Android基礎(chǔ)之Fragment

一丶設(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)一致

onAttach()

在片段已與 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 疊加顯示。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容