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);  
        }  
    }

你可能感兴趣的:(Activity 与 Fragment 通信方式总结)