利用介面回調實現fragment與activity的通訊,fragmentactivity
Fragment 與activity相互傳遞資料,可按如下方式進行:
1、Activity 向Fragment傳遞資料:在Activity中建立Bundle資料包(如果傳輸涉及對象,要實現對象的系列化),並調用Fragment的setArguments(Bundle bundle)方法即可實現將Bundle資料包傳給Fragment,這個很容易實現。
2、但是如果反過來呢,單我們點擊觸發Fragment的事件時,希望將資料返回Activity,Activity獲得資料進行之後的操作,也就是Fragment主動向Activity傳遞資料,這也是本博文將要詳細講解的,利用介面回調實現fragment與activity的通訊。
現在假設一個情境:假如Fragment1中是顯示一些新聞的視窗,現在我們需要在點擊新聞視窗的時候(這個新聞視窗是一個Android組件,下面代碼假設它是一個Button,並將它與對應的URL綁定),把對應的uir返回Activity,Activity擷取使用者點擊的新聞視窗資訊URL,然後調用具體新聞的Fragment2進行顯示具體新聞(把URL傳給Fragment2,讓Fragment2載入具體的新聞)。
Fragment1 的核心實現:
[java] view plaincopy
- class Fragment1 extends Fragment {
-
- - - - - - - -
- Button button ;
- //將button綁定網站url
- button.setText("www.baidu.com");
- - - - - - - -
- - - - - - - -
- OnMyclikListener myListener;
- //定義回調介面
- interface OnMyclikListener {
- public void onclik(View v) ;
- }
-
- //定義供Activity調用的函數
- public void setOnclikListener(OnMyclikListener onMyclikListener) {
- this.myListener = onMyclikListener;
- }
-
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
[java] view plaincopy
- //在這裡將被點擊的新聞視窗(v)傳遞給Activity
[java] view plaincopy
- System.out.println("還有我");
- }
- });
- - - - - - - -
- - - - - - - -
- - - - - - - -
-
- }
[java] view plaincopy
- Activity的核心實現
[java] view plaincopy
- class MyActivity extends Activity {
- - - - - - - -
- //定義Fragment1,然後將Fragment添加到Activity,這裡省略
- Fragment1 fragment;
- - - - - - - -
- - - - - - - -
- //在Activity裡面調用Fragment的public函數,這個函數我們上面有定義
- fragment.setOnclikListener(new OnMyclikListener) {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //注意,這個參數v,其實是Fragment1裡button的控制代碼,我們可以通過它來訪問button綁定的url
- Button button = (Button) v;
- String url = button.getText().toString();
- }
- }
- - - - - - - -
- - - - - - - -
- - - - - - - -
- - - - - - - -
- }
[java] view plaincopy
- 梳理下執行順序
[java] view plaincopy
- 1、首先,當我們點擊Fragment1裡面的button的時候,執行Fragment1裡面的一面這部分函數
[java] view plaincopy
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //在這裡將被點擊的新聞視窗(v)傳遞給Activity
- myListener.onclik(v);
[java] view plaincopy
- System.out.println("還有我");
[java] view plaincopy
- }
- );
也就是執行
public void onClick(View v)
函數,但是當執行到
[java] view plaincopy
- //在這裡將被點擊的新聞視窗(v)傳遞給Activity
- myListener.onclik(v);
[java] view plaincopy
- 這句的時候,調用了定義介面的介面函數,並將v當做參數,這個v就是被點擊的button的控制代碼
[java] view plaincopy
- 我們看看,這個介面函數的實現,是在Activity裡面實現的,然後執行轉到Activity
[java] view plaincopy
- 2、上面說到執行轉到Activity,也就是Activity的這部分函數
[java] view plaincopy
- //在Activity裡面調用Fragment的public函數,這個函數我們上面有定義
- fragment.setOnclikListener(new OnMyclikListener) {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //注意,這個參數v,其實是Fragment1裡button的控制代碼,我們可以通過它來訪問button綁定的url
- Button button = (Button) v;
- String url = button.getText().toString();
- }
- }
[java] view plaincopy
- 執行到這裡,Activity就獲得了Fragment1傳遞過來的Url了,實現了Fragment1主動向Activity傳遞資料
[java] view plaincopy
- 當這段函數執行完,然後又回到1</span>
[java] view plaincopy
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //在這裡將被點擊的新聞視窗(v)傳遞給Activity
- myListener.onclik(v);
[java] view plaincopy
- System.out.println("還有我");
[java] view plaincopy
- }
- );
3、回到1中,繼續執行
亦即如所示
[java] view plaincopy
-
[java] view plaincopy
- 總之
[java] view plaincopy
- 1、使用者Fragment1裡面的button點擊事件,就實現了Fragment1主動將資料Url傳遞給Activity,Activity獲得url後,就可以進行以後的操作了
[java] view plaincopy
- 2、其實讀者有沒有感覺到介面回調的方式很像組件監聽器的方式呢,是的,Android的組件監聽介面也是回調介面,也是這麼實現的