关于Activity和Fragment之间数据传递的方法

1.总述

关于Android里的Activity与Fragment之间的数据传递,主要可以分为以下几类:
  • Activity与Activity之间传递数据
  • Activity与Fragment之间传递数据
  • Fragment与Fragment之间传递数据

下面就一一举例来说明。

2.数据传递方法及源码

2.1 Activity与Activity

Activity之间传递数据的方式主要有以下几种:
  • Intent传递数据
  • 公有静态成员变量
  • sendBroadcast和BroadcastReceiver
  • startActivityForResult
  • SQLite数据库
  • SharePreference
  • Provider(主要用于不同进程之间)

今天主要分析Activity启动Activity时传递数据的方法。

2.1.1 Intent传递数据

在MainActivity:

	Intent intent = new Intent(this,SecondActivity.class);
	intent.putExtra("Data","By Intent");
	startActivity(intent);

在SecondActivity中,通过获取intent携带的数据实现数据传输:

	Intent intent = getIntent();
	if(intent != null){
	    String info = intent.getStringExtra("Data");
	    mTextView.setText(info);
	    if(info != null){
	        Log.i("Activity2Activity","SecondActivity get " + info);
	        finish();
	    }
	}

2.1.2 startActivityForResult

在MainActivity启动SecondActivity:

	 Intent intent1 = new Intent(this,SecondActivity.class);
	 startActivityForResult(intent1,mRequestCode);

SecondActivity中:

	Intent data = new Intent();
	data.putExtra("DataFromActivity2","startActivityForResult");
	setResult(RESULT_OK,data);
	finish();
这里补充一个之前遇到的问题,setResult需要在finish()之前执行,否则可能不起作用。

最后在MainActivity中,通过回调onActivityResult()得到从SecondActivity返回的数据。

	@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //判断是否返回成功
        if(resultCode == RESULT_OK){
            //判断来自哪个Activity
            if (requestCode == mRequestCode){
                //做你想要的操作
                String dataInfo = data.getStringExtra("DataFromActivity2");
                Log.i("Activity2Activity","MainActivity get " + dataInfo);
            }
        }
    }

以上方法得到的结果:
logcat打印

2.2 Activity与Fragment

Activity与Fragment之间传递数据的方法有以下几种:
  • Bundle传递数据
  • onAttach方法
  • 接口回调方法

2.2.1 Activity使用Bundle传递数据到Fragment

在MainActivity启动Fragment:

	FirstFragment fragment = new FirstFragment();
	Bundle bundle = new Bundle();
	bundle.putString("MainActivity2FirstFragment",0x01);
	fragment.setArguments(bundle);

在FirstFragment接收数据:

	Bundle bundle = getArguments();
	if(bundle != null){
	    int dataInt = bundle.getInt("MainActivity2FirstFragment",0x00);
	    Log.i("dataInt",dataInt+"");
	}

2.2.2 Fragment使用onAttach方法从Activity

在MainActivity中,实现提供数据公有方法:

	 public String getString(){
	        return "MainActivity";
	    }

在FirstFragment中,重写onAttach方法:

	@Override
	public void onAttach(Activity activity) {
	    super.onAttach(activity);
	    String string = ((MainActivity) activity).getString();
	    Log.i("string",string);
	}

2.2.3 Activity利用Fragment的接口获取数据

实现步骤如下
  1. 在Fragment中写一个回调接口
  2. 在Activity实现回调接口
  3. 在Fragment中onAttach方法中得到Activity实现好的实例化接口对象
  4. 用接口对象进行数据传递

在FirstFragment中实现步骤1,3,4:

	@Override
	public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
	    View view = inflater.inflate(R.layout.fragment_first,null);
	    
	    mButton.setOnClickListener(new View.OnClickListener() {
	        @Override
	        public void onClick(View view) {
	            mDataCallBack.sendData("dataFromDataCallBack");
	        }
	    });
	
	    return view;
	}
	
	@Override
	public void onAttach(Activity activity) {
	    super.onAttach(activity);
	    mDataCallBack = (DataCallBack) activity;
	}
	
	public interface DataCallBack{
	     void sendData(String string);
	}

在MainActivity中实现步骤2:

	@Override
	public void sendData(String string) {
	    Log.i("sendData",string);
	}

2.3 Fragment与Fragment

Fragment与Fragment之间传输数据的常用方法主要有以下两种:
  • 公有方法
  • 回调接口

2.3.1 Fragment利用公有方法进行数据传递

在FirstFragment中:

	 public String getString(){
	        return "FirstFragment";
	    }

在SecondFragment中获取数据

	FirstFragment firstFragment = (FirstFragment) getFragmentManager().findFragmentByTag("FirstFragment");
	String string = firstFragment.getString();
	Log.i("firstFragment.getString()",string);

2.3.2 Fragment利用回调接口进行数据传递

  • 在FirstFragment创建回调接口和方法
	private OnDataSendListener mListener;
	public interface OnDataSendListener {
	     void dataSend(String data);
	}
	public void setOnDataSendListener(OnDataSendListener mListener) {
	    this.mListener = mListener;
	}
  • 进行接口回调
 	mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(mListener != null){
                    mListener.dataSend("OnDataSendListener");
                }
            }
        });
  • 进行数据传递
 	 FirstFragment firstFragment = (FirstFragment) getFragmentManager().findFragmentByTag("FirstFragment");
     firstFragment.setOnDataSendListener(new FirstFragment.OnDataSendListener() {
          @Override
          public void dataSend(String data) {
                 Log.i("setOnDataSendListener",data);
            }
     });

以上两种方法就都简单方便地实现了Fragment之间的数据传递了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值