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);
}
}
}
以上方法得到的结果:
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的接口获取数据
实现步骤如下
- 在Fragment中写一个回调接口
- 在Activity实现回调接口
- 在Fragment中onAttach方法中得到Activity实现好的实例化接口对象
- 用接口对象进行数据传递
在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之间的数据传递了。