Activity 与 Fragment 通信方式总结

版权声明:本文为DmrfCoder原创作品,如有转载请注明出处 https://blog.csdn.net/qq_36982160/article/details/82802544

概述

通常,Fragment 与 Activity 通信存在三种情形:

  • Activity 操作内嵌的 Fragment

  • Fragment 操作宿主 Activity

  • Fragment 操作同属 Activity中的其他 Fragment

    在Android中我们可以通过以下几种方式优雅地实现Activity和fragment之间的通信:

  • Handler

  • 广播

  • EventBus

  • 接口回调

  • Bundle和setArguments(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);  
        }  
    }

猜你喜欢

转载自blog.csdn.net/qq_36982160/article/details/82802544
今日推荐