天天看點

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

【正文】

一、接口回調的簡單引入:

我們先來看一個簡單的接口回調的例子:

建立一個java工程,然後建立一個包。然後建立一個a.java檔案:

a.java代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

第21至23行就是回調方法。

建立b.java,代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

最後程式運作的結果如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

關于接口回調,有一個部落格,不過現在還不能完全了解,附上連結:

二、fragment和activity的互動:

1、在fragment中調用activity中的方法:

fragment可以通過getactivity()方法來獲得activity的執行個體,然後就可以調用一些例如findviewbyid()之類的方法。例如:

但是注意調用getactivity()時,fragment必須和activity關聯(attached to an activity),否則将會傳回一個null。

另外,當碎片中需要使用context對象時,也可以使用getactivity()方法,是以擷取到的活動本身就是一個context對象。

【執行個體】在activity的edittext中輸入一段文本,這個時候,點選fragment中的按鈕,讓它彈出吐司,顯示出對應的文本。

其實就是讓activity中的文本顯示在fragment中,fragment的核心代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

第09行代碼是核心,通過getactivity()方法來獲得activity的執行個體,然後就可以調用findviewbyid()的方法得到其中的edittext控件。

2、在activity中調用fragment中的方法:(要用到接口回調)

activity也可以獲得一個fragment的引用,進而調用fragment中的方法。獲得fragment的引用要用fragmentmanager,之後可以調用findfragmentbyid() 或者 findfragmentbytag()。例如:

具體例子稍後再講。

3、fragment與fragment之間的通信:

既然fragment和activity之間的通信問題解決了,那fragment與fragment之間的通信也沒有那麼複雜。基本思路是:

首先在一個fragment中可以得到與它相關聯的activity,然後再通過這個activity去擷取另外一個fragment的執行個體,這樣就實作了不同fragment之間的通信。

三、建立事件回調(在activity中擷取fragment中的值):

一些情況下,可能需要fragment和activity共享事件,一個比較好的做法是在fragment裡面定義一個回調接口,然後要求宿主activity實作這個接口。當activity通過這個接口接收到一個回調,它可以讓同布局中的其他fragment分享這個資訊。

例如,一個新聞顯示應用在一個activity中有兩個fragment,一個fragment a顯示文章題目的清單,一個fragment b顯示文章。是以當一個文章被選擇的時候,fragment a必須通知activity,然後activity通知fragment b,讓它顯示這篇文章。(例子的代碼見官方文檔)

我們現在舉一個其他的例子:

【執行個體】在fragment中輸入值,點選activity中的按鈕,彈出吐司,顯示之前輸入的值。其實就是讓fragment中的文本顯示在activity中

我們在平闆的左側加入一個fragment,完整代碼如下:

fragment_left.xml代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

其實就是加了一個edittext,友善在裡面輸入文本内容。

然後在frament中加一個接口回調,讓它在activity當中調用,友善擷取輸入文本的值。leftfragment.java的代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

代碼解釋如下:

第25行:一定要為edittext加一個id,不然會報空指針異常的錯誤;

34至42行:添加一個接口回調,用于擷取文本的值,然後稍後再activity當中進行調用。

activity_main.xml的代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

其實一共就兩個線性布局,左邊的現性布局留給fragment,右邊的線性性局留給activity。

mainactivity.java的代碼如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)
Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

我們在activity當中動态加載fragment,然後點選按鈕,通過接口回調,擷取fragment當中edittext的值,并彈出吐司。

程式運作後,在左側的fragment的edittext當中輸入值,點選右側的按鈕,彈出吐司,效果如下:

Android系列之Fragment(三)----Fragment和Activity之間的通信(含接口回調)

繼續閱讀