Fragment和Activity之間的數據傳遞

在電子信息飛速發展的當代,手機的屏幕也越來越大,開發安卓應用時,多窗口也越來越被人們所需要。安卓組件中,Activity代表視窗,裏面可以承載許多視圖,但通常視圖之間相互影響,互相關聯,在多任務處理需求時,往往不能滿足人們的要求,於是一些視窗分割化的組件開始出現。早期是TabActivity,後來被Fragment所取代,Fragment是Android3.0以後的新組件,附加於Activity,同時也有自己的生命週期,能獨立地在自己的佈局內處理很多事件而不受外界干擾,於是越來越受到安卓應用開發者的青睞。

雖然Fragment因其獨立性受到喜愛,但同時,在同一個Activity上,Fragment和其他組件,尤其是和同一Activity上的其他Fragment之間的數據傳遞也受到很多限制。因此,在Fragment和Activity的數據傳遞方面,需要特定的方式才能實現。

常用的方法有:1.設置Activity的成員變量,讓Fragment也能訪問到,實現數據交互;2.通過setArgument和getArgument來實現數據的傳遞;3.Fragment的內部回調接口。而我今天要說的就是這第三種方法,也是最爲常用和高效的傳遞方式。下面通過一個Demo來說明講解如果通過回調接口實現參數傳遞。

下圖是一個分爲兩部分的Activity,上面一半是一個Fragment,中包含一個列表,列表中是劉備的五虎將,下面一半也是一個Fragment,中包含一個TextView,現在要實現的功能是,點擊上面列表中的某一項,將列表項的文字傳遞到下面Fragment中的TextView中去。


上面的Fragment我稱之爲FirstFragment,其中包含一個ListView,內容如圖所示。在這個Fragment裏面最關鍵的地方是OnclickListener這個內部接口,這也是該方法實現中最難於理解的部分,如果能充分理解這個內部接口,那麼也就能充分理解這種數據傳遞方式的根本了。這個接口是由Activity來繼承的,爲什麼要Activity來繼承這個接口,顯得很麻煩的樣子,因爲當Activity實現這個內部接口之後,必然要實現接口裏面未實現的方法,而這個方法又是Fragment可以自由調用的。這樣就容易理解了,方法寫在Fragment中,卻在Activity中實現,故Activity可以自由的傳入參數,但由Fragment調用,所以就很好地實現了Fragment和Activity之間的參數傳遞。


創建Fragment的時候加載佈局,初始化組件,併爲ListView設置監聽。


上圖中的onPressEnter()方法正是內部接口中的抽象方法,按說抽象方法怎能被調用呢?勿急,慢慢看。

下圖是Fragment附加到Activity上和從Activity上脫離時會由系統執行的兩個回調方法。該方法表示在Fragment附加到Activity上時,將Activity向上轉型成爲Fragment的內部接口類型OnclickListener;


下圖是ListView監聽時調用的方法,這個方法在此處實現,但仔細觀察可以知道,並不是真的實現了這個方法,只不過是調用了接口的方法佈局,此處寫法有誤導的嫌疑,實際上這個方法完全可以不叫onPressEnter(),望勿見怪,功能只是調用接口的onPressEnter方法而已。


好了,FirstFragment中的代碼展示完畢,下面展示SecondFragment中的代碼,


SecondFragment中的方法很簡單,只是寫了一個setText()的方法而已,該方法用於設置Fragment上那個TextView顯示的內容,但這個方法並不在SecondFragment本身中調用,而是在Activity中調用,Activity的代碼如圖



onPressEnter()方法由Activity實現,並在此方法中調用SecondFragment的setText()方法,當點擊FirstFragment上的列表時,FirstFragment將列表中的文字通過onPressEnter(String stirng)方法傳遞給Activity,然後在方法中調用SecondFragment的setText()方法,將FirstFragment中傳遞過來的數據顯示到SecondFragment上來。如此,就實現了Activity和Fragment,甚至是Fragment和Fragment之間的參數傳遞。


附上Demo的鏈接:http://download.csdn.net/detail/yuqiaoo/8813737


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章