android 基础问题锦记(1)fragment之间传递数据的3种方式

fragment之间传递数据的方式?

有3种方式:
情景:创建两个Fragment,MenuFragment和MainFragment ;MenuFragment对应一个布局为一个listview显示适配item条目,MainFragment 对应就是一个textView 显示如下:
这里写图片描述
需求:我们点击上面图片中展示的对应的条目数据,让右侧(黄色按钮)对应的文本数据更换成条目展示的文本,例如:我点击左侧第4个条目,右侧按钮文本立马更改成“这是第4条数据”,从而实现Fragment之间数据的传递。下面开始介绍三种方法实现Fragment之间数据的传递。
方法一:
1、在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称;

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

2、在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));
   }
});

方法二:
采取接口回调的方式进行数据传递。
1: 在Menuragment中创建一个接口以及接口对应的set方法:

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

2: 在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));
      }
  }
});

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

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

方法三:
使用三方开源框架:EventBus
https://juejin.im/entry/570ae5668ac247004c3128a4
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);
}

项目地址:D:\一些功能性工程\Fragment传递参数的3种形式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值