Activity 與 Fragment 通信方式總結

轉載自( 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)

參見Android如何優雅地向Fragment傳遞參數

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);  
        }  
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容