西安電子科技大學機電工程學院 郭雨佳 韓雨辰 趙明英 朱俊杰
在現(xiàn)有智能手機操作系統(tǒng)中,Android占絕對主導地位。Activity是Android四大組件之一,F(xiàn)ragment是一種嵌套在Activity中的UI組件。由于多個Activity的進棧出棧會造成程序卡頓,所以實際開發(fā)的時候,為了達到更好的用戶體驗大多會使用Fragment來設計用戶交互界面。正因如此,Activity和Fragment之間的通信便顯得尤為重要。本文分析了兩者間的多種通信方式,提出接口回調方式是進行通信的最佳方式。
在Android程序設計中,Activity是重要的控件之一。一個Activity就代表了應用程序中的一個頁面。每次點擊頁面進行跳轉的時候,需要將當前的Activity的狀態(tài)保存至堆棧,下次使用的時候再從堆棧中取出來展示給用戶。這樣不斷的進出堆棧,將會導致應用程序運行過程中出現(xiàn)卡頓,嚴重影響用戶體驗。為了解決這一問題,Android系統(tǒng)引入了Fragment。Fragment并不是一個獨立的部分,是一種可以嵌入到Activity中的UI控件。Fragment的出現(xiàn)使在同一個Activity上進行界面的切換成為現(xiàn)實。
創(chuàng)建Fragment的方法有動態(tài)和靜態(tài)兩種。前者就是通過Java代碼來創(chuàng)建Fragment的實例,后者則是在編寫Activity的xml布局文件時通過<fragment>標簽實現(xiàn)控件的創(chuàng)建。
動態(tài)創(chuàng)建的具體步驟:
第一步:在當前Activity的布局文件中創(chuàng)建FrameLayout并為其設置id;
第二步:鼠標移動到當前包名處并單擊右鍵,選擇new->Fragment->Blank Fragment,創(chuàng)建新的Fragment;
第三步:在Activity的onCreat()方法中使用代碼將fragment添加到FrameLayout。
靜態(tài)創(chuàng)建的具體步驟:
第一步:鼠標移動到當前包名并單擊右鍵,選擇new->Fragment->Blank Fragment,創(chuàng)建新的Fragment;
第二步:在在xml文件中創(chuàng)建fragment控件,并通過name屬性引入fragment文件,同時可以為fragment創(chuàng)建一個id,以便后續(xù)的使用。
由于Fragment是嵌入到Activity中的一種控件,所以它不會單獨存在,它必須附著到Activity中?;诖?,F(xiàn)ragment的生命周期會受到Activity生命周期的影響。Fragment和Activity有著相似的生命周期,它會隨著Activity的暫停而暫停,隨著Activity的銷毀而銷毀。我們就可以對附著在Activity上面的Fragment進行操作的前提是這個Activity是處于正常運行中的。常見的操作有添加、替換和刪除等。Fragment的生命周期如圖1所示。
圖1 Fragment的生命周期示意圖
通過調用getSupportFragmentManager()函數(shù)可以拿到用來操作Fragment的Manager,然后通過它的findFragmentByTag()或者findFragmentById()拿到我們需要通信的Fragment實例(如果Fragment是直接在XML中定義的,那么就使用findFragmentById()拿到Fragment),然后就可以對拿到的Fragment進行各種操作了。
我們可以通過getActivity().findViewById()的方法獲取Fragment附著的Activity中的控件,但是這種方式代碼耦合性太強,不利于代碼的移植和優(yōu)化,所以更多情況下采用回調方法來進行二者的通信。在Fragment中聲明一個接口并提供一個接口的引用變量,接口中定義所需的方法,然后讓Activity實現(xiàn)此接口并按照需要重寫接口中的方法。當Fragment需要訪問Activity中數(shù)據(jù)時,只需要通過接口實例調用接口方法并將參數(shù)傳遞,具體的操作代碼則在Activity中的接口方法中完成。
由于Fragment是依附于Activity的,所以Fragment之間通信不能直接通信,必須依靠所依附的Activity。為了降低代碼之間的耦合,可以通過回調實現(xiàn)Fragment之間通信。
任意Fragment之間要想通信必須通過他們所屬的Activity來完成,不能是多個Fragment之間的直接通信、調用。同理,F(xiàn)ragment要訪問它所附著的Activity中的信息也得在Activity中進行。Fragment與其所附著的Activtiy之間通信的最佳方式應該是:
在發(fā)起事件的Fragment中定義一個接口,接口中聲明你的方法;
在onAttach()方法中要求Activity實現(xiàn)接口;
在Activity中實現(xiàn)該接口并重寫該方法。