Activity 與 Fragment 通信方式總結(jié)

轉(zhuǎn)載自( https://blog.csdn.net/qq_36982160/article/details/82802544)

三種情形:
1.Activity操作內(nèi)嵌的Fragment
2.Fragment操作宿主Activity
3.Fragment操作同屬Activity的其他Fragment

方式:
1.Handler
2.廣播
3.EventBus
4.接口回調(diào)
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);
                 //相應(yīng)的邏輯處理代碼
           }
     }
     
   } 
    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復(fù)用

不利于維護,若想刪除相應(yīng)的Activity,F(xiàn)ragment也得改動

沒法獲取Activity的返回數(shù)據(jù)

所以一般不建議使用這種方法。

廣播

在 Activity 中注冊廣播接收器,在 Fragment中發(fā)送廣播:

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發(fā)送信息
UserEvent event=new UserEvent();
EventBus.getDefault().post(event);

接口回調(diào)

  • 在 Fragment 中定義一個接口
  • 調(diào)用接口中的抽象方法
  • 在 Activity 中實現(xiàn)接口,并具體實現(xiàn)接口中的方法,完成通信。

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進行接口轉(zhuǎn)換
             if(activity instance FragmentListener){
             
                 mListener = ((FragmentListener)activity); 
                 
            }
       }
       ...其他處理代碼省略 
       
       mButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              msgListener.showMsg("Hello 傳遞數(shù)據(jù)給Activity展示");
          }
      });
}

Activity

// MainActivity 實現(xiàn) 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如何優(yōu)雅地向Fragment傳遞參數(shù)

Fragment && Fragment 數(shù)據(jù)交互

Fragment和Fragment間數(shù)據(jù)交互,應(yīng)該也是會經(jīng)常用到的。我們可以使用宿主Activity做傳遞媒介。原理其實也是通過使用onActivityResult回調(diào),完成Fragment && Fragment 的數(shù)據(jù)交互,這其中有兩個比較重要的方法:Fragment.setTargetFragment、getTargetFragment()。

在 FirstFragment 中,通過setTargetFragment來連接需要交互的Fragment:

secondFragment.setTargetFragment(FirstFragment.this, REQUEST_CODE);

接著實現(xiàn)onActivityResult,處理傳遞過來的數(shù)據(jù)

@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);  
           //處理數(shù)據(jù)...
       }  
   }

在 SecondFragment 中調(diào)用sendResult()方法,回傳數(shù)據(jù)給 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);  
        }  
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容