Activity與Fragment通信——回調方法實現
1. 回調方法的介紹:
- 所謂回調,就是客戶程序C調用服務程序S中的某個函數A,然後S又在某個時候反過來調用C中的某個函數B,對於C來說,這個B便叫做回調函數。例如Win32下的窗口過程函數就是一個典型的回調函數。一般說來,C不會自己調用B,C提供B的目的就是讓S來調用它,而且是C不得不提供。由於S並不知道C提供的B姓甚名誰,所以S會約定B的接口規範(函數原型),然後由C提前通過S的一個函數R告訴S自己將要使用B函數,這個過程稱爲回調函數的註冊,R稱爲註冊函數。Web Service以及Java的RMI都用到回調機制,可以訪問遠程服務器程序。
下面舉個通俗的例子:
- 某天,我打電話向你請教問題,當然是個難題,^_^,你一時想不出解決方法,我又不能拿着電話在那裏傻等,於是我們約定:等你想出辦法後打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“異步+回調”的編程模式。其中,你後來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是註冊回調函數;我的手機號碼應該有效並且手機能夠接收到你的呼叫,這是回調函數必須符合接口規範。
—–以上內容摘自網絡
2. Activity與Fragment利用回調方法進行通信
Fragment向Activity發送消息:
創建回調方法接口類
public interface MyCallBack { public void callBack(String message); }
讓Activity實現該接口 並 實現接口定義的方法
public class MainActivity extends Activity implements MyCallBack{ ...... @Override public void callBack(String message) { Log.d("myinfo", "MainActivity接受到的消息是:" + message); } }
在Fragment中獲取與其綁定的Activity的引用(這裏onAttach()方法要注意,後面會講到)
public class MyFragment extends Fragment { private MyCallBack myCallBack; ...... @Override public void onAttach(Context context) { super.onAttach(context); if (!(context instanceof MyCallBack)) { throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!"); } myCallBack = (MyCallBack) context; } }
在Fragment中向Activity傳遞消息
myCallBack.callBack("這是從MyFragment發出的消息!");
注意:
Fragment的生命週期方法有兩個onAttach()方法,根據Android版本的不同會調用不同的方法
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof MyCallBack)) {
throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
}
myCallBack = (MyCallBack) activity;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (!(context instanceof MyCallBack)) {
throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
}
myCallBack = (MyCallBack) context;
}
具體代碼:
MyCallBack:
package com.zhenggy.test;
/**
* Created by ashzheng on 2016/6/14.
*/
public interface MyCallBack {
public void callBack(String message);
}
MainActivity:
package com.zhenggy.test;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity implements MyCallBack {
private FragmentManager fragmentManager;
private MyFragment myFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (null != myFragment) {
fragmentTransaction.show(myFragment);
} else {
myFragment = new MyFragment();
fragmentTransaction.add(R.id.activity_main_show_fragment_layout, myFragment);
}
fragmentTransaction.commit();
}
@Override
public void callBack(String message) {
Log.d("myinfo", "MainActivity接受到的消息是:" + message);
}
}
MyFragment:
package com.zhenggy.test;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by ashzheng on 2016/6/14.
*/
public class MyFragment extends Fragment {
private MyCallBack myCallBack;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myFragment = inflater.inflate(R.layout.fragment_my, container, false);
myFragment.findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("myinfo", "MyFragment發出消息");
myCallBack.callBack("這是從MyFragment發出的消息!");
}
});
return myFragment;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof MyCallBack)) {
throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
}
myCallBack = (MyCallBack) activity;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (!(context instanceof MyCallBack)) {
throw new IllegalStateException("MyFragment所在的Activity必須實現MyCallBack接口!");
}
myCallBack = (MyCallBack) context;
}
}