Android fragment之间传递数据的方式?

发布于 2020-01-11 22:52:40
关注者
0
被浏览
4484
1 个回答
  • 面试哥
    面试哥 2020-01-11
    为面试而生,有面试问题,就找面试哥。

    方法一:

    1、在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称; //MainFragment.java文件中

    public void setData(String string) {
    
    bt_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));
    
    }
    
    });
    

    只需上面区区两步即可达到数据传递的目的。 方法二: 采取接口回调的方式进行数据传递。

    step1: 在Menuragment中创建一个接口以及接口对应的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));
    });
    

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

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

    通过上面的三步也可以轻松做到Fragment数据之间的传递。 方法三: 使用三方开源框架:EventBus 那么问题来了:EventBus是个啥东西??? 简单来说,EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。 下面我们就用EventBus来实现以下Fragment之间的数据传递:

    step1:引入EventBus compile 'org.greenrobot:eventbus:3.0.0' step2:注册事件接收者 这里MainFragment是要接收MenuFragment发送来的数据,所以我们在MainFragment中的onCreateView()方法中进行注册: EventBus.getDefault().register(this); step3:发送事件 注:发送事件之前其实还有一步定义事件类型,这里我们传递的数据只有一个类型,所以这一步取消了。 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));
    }
    });
    

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

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

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

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

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

知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看