Android Fragment 片段 碎片 相關程序员Android开发

Android Fragment(三)传递数据的三种方法

2017-10-18  本文已影响71人  侯蛋蛋_

Fragment 生命周期(一)

Fragment两种加载方式及ViewPage(二)

Fragment 传递数据的三种方法(三)
需要展示的界面如下:

需求

布局我们这里就不写了,很简单,左面的是MenuFragment,用ListView布局。右面的是MainFragment,用Button布局。

我们点击上面图片中展示的对应的条目数据,让右侧(黄色按钮)对应的文本数据更换成条目展示的文本,例如:我点击左侧第4个条目,右侧按钮文本立马更改成“这是第4条数据”,从而实现Fragment之间数据的传递。下面开始介绍三种方法实现Fragment之间数据的传递。

在MainActivity的onCreate()方法中引入这两个Fragment:

MenuFragment menuFragment = new MenuFragment();
MainFragment mainFragment  = new MainFragment();
//将上面的两个Fragment添加进来
getSupportFragmentManager().beginTransaction().replace(R.id.fl_menu, menuFragment, "menuFragment").commit();
getSupportFragmentManager().beginTransaction().replace(R.id.fl_main, mainFragment, "mainFragment").commit();

方法一

第一步、在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称;

//MainFragment.java文件中
public void setData(String string) {
  bt_main.setText(string);
}

第二步、获取MainFragment

在MenuFragment中的ListView条目点击事件中通过标签获取到MainFragment,并调用对应的setData()方法,将数据设置进去,从而达到数据传递的目的。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        MainFragment mainFragment =
             (MainFragment) getActivity()
             .getSupportFragmentManager()
             .findFragmentByTag("mainFragment");
        mainFragment.setData(mDatas.get(position));
   }
});

只需上面区区两步即可达到数据传递的目的。

方法二

采取接口回调的方式进行数据传递。

step1: 在MenuFragment中创建一个接口以及接口对应的set方法:

//MenuFragment.java文件中
public interface OnDataTransmissionListener {
  public void dataTransmission(String data);
}
public void setOnDataTransmissionListener(OnDataTransmissionListener mListener) {
  this.mListener = mListener;
}

step2: 在MenuFragment中的ListView条目点击事件中进行接口进行接口回调

//MenuFragment.java文件中
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      /**
       * 方法二:采取接口回调的方式进行数据传递
       */
      if (mListener != null) {
          mListener.dataTransmission(mDatas.get(position));
      }
  }
});

strp3:在MainFragment设置setData

//MainFragment.java文件中
public void setData(String string) {
  bt_main.setText(string);
}

step4: 在MainActivity中根据menuFragment获取到接口的set方法,在这个方法中进行进行数据传递,具体如下:

//在MainActivity.java中
menuFragment.setOnDataTransmissionListener(new MenuFragment.OnDataTransmissionListener() {
  @Override
  public void dataTransmission(String data) {
      mainFragment.setData(data);  //注:对应的mainFragment此时应该要用final进行修饰
  }
});

方法三:使用三方开源框架:EventBus

那么问题来了:EventBus是个啥东西???

简单来说,EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。

下面我们就用EventBus来实现以下Fragment之间的数据传递:

1):引入EventBus

compile 'org.greenrobot:eventbus:3.0.0'

2):注册事件接收者

这里MainFragment是要接收MenuFragment发送来的数据,所以我们在MainFragment中的onCreateView()方法中进行注册:

EventBus.getDefault().register(this);

3):发送事件

注:发送事件之前其实还有一步定义事件类型,这里我们传递的数据只有一个类型,所以这一步取消了。
MenuFragment发送数据给MainFragment,所以我们在MenuFragment中将要传递的数据进行发送事件操作:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      EventBus.getDefault().post(mDatas.get(position));
  }
});

4)接收消息并处理

在MainFragment中我们接收来自MenuFragment传递过来的数据,并进行对应的处理(注:EventBus 3.0版本这一步必须要写注解@Subscribe (与2.4版本有所区别)):

@Subscribe
public void onEvent(String data) {
  bt_main.setText(data);
}

通过上面这一步即可完成数据之间的传递,需要注意的是在销毁的时候我们要注销事件接收。

5)注销事件接收

//MainFragment.java中
@Override
public void onDestroy() {
  super.onDestroy();
  EventBus.getDefault().unregister(this);
}

以上五步完成了Fragment之间的数据传递,看似比上面两个方法要复杂的多,但当我们涉及到复杂的Fragment之间数据传递(例如Fragment中嵌套多层Fragment)时,就会体会到EventBus的爽快之处~~~这里不进行赘述了。

上一篇下一篇

猜你喜欢

热点阅读