利用介面回調實現fragment與activity的通訊,fragmentactivity

來源:互聯網
上載者:User

利用介面回調實現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
  1. class Fragment1 extends Fragment {  
  2.   
  3.     - - - - - - -  
  4.     Button button ;  
  5.     //將button綁定網站url  
  6.     button.setText("www.baidu.com");  
  7.     - - - - - - -  
  8.     - - - - - - -  
  9.     OnMyclikListener myListener;  
  10.     //定義回調介面  
  11.     interface OnMyclikListener {  
  12.         public void onclik(View v) ;                      
  13.     }  
  14.       
  15.     //定義供Activity調用的函數  
  16.     public void setOnclikListener(OnMyclikListener onMyclikListener) {  
  17.         this.myListener = onMyclikListener;               
  18.     }  
  19.       
  20.     button.setOnClickListener(new OnClickListener() {  
  21.           
  22.         @Override  
  23.         public void onClick(View v) {  
  24.             // TODO Auto-generated method stub  
[java] view plaincopy
  1. //在這裡將被點擊的新聞視窗(v)傳遞給Activity  
[java] view plaincopy
  1.                                System.out.println("還有我");  
  2.         }  
  3.     });  
  4.     - - - - - - -  
  5.     - - - - - - -  
  6.     - - - - - - -  
  7.       
  8. }  
[java] view plaincopy
  1. Activity的核心實現  
[java] view plaincopy
  1. class MyActivity extends Activity {  
  2.     - - - - - - -  
  3.     //定義Fragment1,然後將Fragment添加到Activity,這裡省略  
  4.     Fragment1 fragment;  
  5.     - - - - - - -  
  6.     - - - - - - -  
  7.     //在Activity裡面調用Fragment的public函數,這個函數我們上面有定義  
  8.     fragment.setOnclikListener(new OnMyclikListener) {  
  9.         @Override  
  10.         public void onClick(View v) {  
  11.             // TODO Auto-generated method stub  
  12.             //注意,這個參數v,其實是Fragment1裡button的控制代碼,我們可以通過它來訪問button綁定的url  
  13.             Button button = (Button) v;  
  14.             String url = button.getText().toString();  
  15.         }  
  16.     }  
  17.     - - - - - - -  
  18.     - - - - - - -  
  19.     - - - - - - -  
  20.     - - - - - - -  
  21. }  





[java] view plaincopy
  1. 梳理下執行順序  
[java] view plaincopy
  1. 1、首先,當我們點擊Fragment1裡面的button的時候,執行Fragment1裡面的一面這部分函數  
    [java] view plaincopy
  1. button.setOnClickListener(new OnClickListener() {  
  2.               
  3.             @Override  
  4.             public void onClick(View v) {  
  5.                 // TODO Auto-generated method stub  
  6.                 //在這裡將被點擊的新聞視窗(v)傳遞給Activity  
  7.                 myListener.onclik(v);  
[java] view plaincopy
  1. System.out.println("還有我");  
[java] view plaincopy
  1. }  
  2. );  
也就是執行

public void onClick(View v)

函數,但是當執行到

[java] view plaincopy
  1. //在這裡將被點擊的新聞視窗(v)傳遞給Activity  
  2. myListener.onclik(v);  
[java] view plaincopy
  1. 這句的時候,調用了定義介面的介面函數,並將v當做參數,這個v就是被點擊的button的控制代碼  
[java] view plaincopy
  1. 我們看看,這個介面函數的實現,是在Activity裡面實現的,然後執行轉到Activity  
[java] view plaincopy
  1. 2、上面說到執行轉到Activity,也就是Activity的這部分函數  
[java] view plaincopy
  1. //在Activity裡面調用Fragment的public函數,這個函數我們上面有定義  
  2.     fragment.setOnclikListener(new OnMyclikListener) {  
  3.         @Override  
  4.         public void onClick(View v) {  
  5.             // TODO Auto-generated method stub  
  6.             //注意,這個參數v,其實是Fragment1裡button的控制代碼,我們可以通過它來訪問button綁定的url  
  7.             Button button = (Button) v;  
  8.             String url = button.getText().toString();  
  9.         }  
  10.     }  
[java] view plaincopy
  1. 執行到這裡,Activity就獲得了Fragment1傳遞過來的Url了,實現了Fragment1主動向Activity傳遞資料  
[java] view plaincopy
  1. 當這段函數執行完,然後又回到1</span>  
[java] view plaincopy
  1. button.setOnClickListener(new OnClickListener() {  
  2.               
  3.             @Override  
  4.             public void onClick(View v) {  
  5.                 // TODO Auto-generated method stub  
  6.                 //在這裡將被點擊的新聞視窗(v)傳遞給Activity  
  7.                 myListener.onclik(v);  
[java] view plaincopy
  1. System.out.println("還有我");  
[java] view plaincopy
  1. }  
  2. );  

3、回到1中,繼續執行

亦即如所示


[java] view plaincopy
  1.   
[java] view plaincopy
  1. 總之  
[java] view plaincopy
  1. 1、使用者Fragment1裡面的button點擊事件,就實現了Fragment1主動將資料Url傳遞給Activity,Activity獲得url後,就可以進行以後的操作了  
[java] view plaincopy
  1. 2、其實讀者有沒有感覺到介面回調的方式很像組件監聽器的方式呢,是的,Android的組件監聽介面也是回調介面,也是這麼實現的  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.