轉載自( https://blog.csdn.net/qq_36982160/article/details/82802544)
三種情形:
1.Activity操作內嵌的Fragment
2.Fragment操作宿主Activity
3.Fragment操作同屬Activity的其他Fragment
方式:
1.Handler
2.廣播
3.EventBus
4.接口回調
5.Bundle和setArgments(bundle)
Handler
public class MainActivity extends FragmentActivity{
//聲明一個Handler
public Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//相應的邏輯處理代碼
}
}
}
public class MainFragment extends Fragment{
//保存Activity傳遞的handler
private Handler mHandler;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if(activity instance MainActivity){
mHandler = ((MainActivity)activity).mHandler;
}
}
}
這種方式的缺點:
Fragment對具體的Activity存在耦合,不利于Fragment復用
不利于維護,若想刪除相應的Activity,Fragment也得改動
沒法獲取Activity的返回數據
所以一般不建議使用這種方法。
廣播
在 Activity 中注冊廣播接收器,在 Fragment中發送廣播:
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ACTION_NAME)) {
String msg = intent.getStringExtra("msg");
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
};
public void registerBoradcastReceiver() {
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction(ACTION_NAME);
registerReceiver(mBroadcastReceiver, myIntentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mBroadcastReceiver);
}
EventBus
- MainActivity
//注冊訂閱者
EventBus.getDefault().register(this);
//定義接收信息的方法
@Subscribe
public void onEventMainThread(UserEvent event) {
btn.setText(event.getUserName());
service_tv.setText(event.getUserName());
}
- Fragment發送信息
UserEvent event=new UserEvent();
EventBus.getDefault().post(event);
接口回調
- 在 Fragment 中定義一個接口
- 調用接口中的抽象方法
- 在 Activity 中實現接口,并具體實現接口中的方法,完成通信。
Fragment
public class MainFragment extends Fragment{
public FragmentListener mListener;
//MainFragment開放的接口
public static interface FragmentListener{
//跳到h5頁面
void toH5Page();
//展示消息
void showMsg(String str);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
//對傳遞進來的Activity進行接口轉換
if(activity instance FragmentListener){
mListener = ((FragmentListener)activity);
}
}
...其他處理代碼省略
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
msgListener.showMsg("Hello 傳遞數據給Activity展示");
}
});
}
Activity
// MainActivity 實現 MainFragment開放的接口
public class MainActivity extends FragmentActivity implements FragmentListener{
@override
public void toH5Page(){... }
@Override
public void showMsg(String str) {
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
...其他處理代碼省略
}
Bundle和setArguments(bundle)
Fragment && Fragment 數據交互
Fragment和Fragment間數據交互,應該也是會經常用到的。我們可以使用宿主Activity做傳遞媒介。原理其實也是通過使用onActivityResult回調,完成Fragment && Fragment 的數據交互,這其中有兩個比較重要的方法:Fragment.setTargetFragment、getTargetFragment()。
在 FirstFragment 中,通過setTargetFragment來連接需要交互的Fragment:
secondFragment.setTargetFragment(FirstFragment.this, REQUEST_CODE);
接著實現onActivityResult,處理傳遞過來的數據
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != Activity.RESULT_OK){
return;
}else{
Integer str = data.getIntExtra("key",-1);
//處理數據...
}
}
在 SecondFragment 中調用sendResult()方法,回傳數據給 FirstFragment:
private void sendResult(int resultOk) {
if(getTargetFragment() == null){
return;
}else{
Intent intent = new Intent();
intent.putExtra("key", 520);
getTargetFragment().onActivityResult(FirstFragment.REQUEST_CODE,resultOk,intent);
}
}