写在前面
最近的项目里,遇到的朋友圈的功能,朋友圈的模块嵌套在Fragment中,在发布动态时,跳转到另一个Activity,发布后返回到这个Fragment。返回之后,我没有请求后台去刷新,而是把用户发布的动态相关信息,通过Intent携带返回到Fragment。
相关文件
1.包含Fragment的Activity,InformixActivity
2.发布填写动态信息的Activity,AddDynamicActivity
3.朋友圈所在的Fragment,ForumFragment
业务流程
用户在朋友圈的Fragment,点击ActionBar上面的发布按钮。
跳转到动态填写页面,AddDynamicActivity ,在该页面填写完成后,点击发布或者取消,返回到朋友圈Fragment。
在返回Fragment的时候,数据,要通过 InformixActivity ,才能成功传递过去。
主要代码
- 在InformixActivity 中,点击发布按钮
(findViewById(R.id.homeTV)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(InformixActivity.this, AddDynamicActivity.class);
// 将要跳转的发布动态Activity会携带数据返回当前Activity
startActivityForResult(intent, 1);
}
});
这里通过 startActivityForResult 方法进行跳转。第二个参数是requestCode,为了确定返回结果。该方法,可以在跳转新的Activity之后,在新的Activity关闭后,携带数据返回到跳转之前的Activity。
要注意的是 ,要得到返回的数据,要在原来的Activity中即InformixActivity 中重写 onActivityResult方法,后面会说。
- 在AddDynamicActivity中,重写ActionBar的左右两个按钮方法,分别改为取消和分享。
private void actionBarOnClick(){
// 重写取消点击事件
cancelBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 回调onActivityResult
Intent intent = new Intent();
Bundle dynamic = new Bundle();
dynamic.putString("CONTENT", "");
intent.putExtra("DYNAMIC",dynamic);
setResult(1, intent);
AddDynamicActivity.this.finish();
}
});
// 重写分享点击事件
shareBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 携带数据返回上个Activity栈
Intent intent = new Intent();
Bundle dynamic = new Bundle();
// 判断发布分享的内容是否为空
if (dynamicContent.getText().toString().trim().length() > 0) {
dynamic.putString("CONTENT", dynamicContent.getText().toString().trim());
dynamic.putString("TIME", getFormatSysDate("yyyy-MM-dd HH:mm:ss"));
intent.putExtra("DYNAMIC", dynamic);
}else {
// 如果发布内容为空,点击分享和点击取消一样
dynamic.putString("CONTENT", "");
intent.putExtra("DYNAMIC",dynamic);
}
setResult(1, intent);
AddDynamicActivity.this.finish();
}
});
}
在上面代码里可以看到,有**setResult()**方法,第一个参数,就是requestCode,用来标记返回的结果是要返回到requestCode相同的那个Activity。
我在上面的代码里,写了发布和取消的方法,发布空的动态和取消的结果是一样的。通过返回数据的Bundle的 “CONTENT” 的值进行判断。
- 携带结果返回到InformixActivity页面,重写onActivityResult方法。
/**
* 获取AddDynamicActivity返回的数据
*
* Ps:先返回到Activity,然后再从当前Activity传递数据到需要的Fragment
*
* @param requestCode 请求码
* @param resultCode 返回码
* @param data 数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 跳转到朋友圈的onActivityResult
forumFrag.onActivityResult(requestCode, resultCode, data);
}
在onActivityResult方法中,调用ForumFragment的onActivityResult方法,就可以在Fragment中得到携带的数据.
4.在 ForumFragment 重写 onActivityResult方法。
/**
* 获取返回的数据,在Fragment向Activity请求,需要先返回到父Activity,然后传递到Fragment
* @param requestCode 请求码
* @param resultCode 返回码
* @param data 数据
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1){
// 判断发布内容是否为空,是否是取消按钮
if (!"".equals(data.getBundleExtra("DYNAMIC").getString("CONTENT"))){
Map<String, String> addDynamic = new HashMap<>();
addDynamic.put("CREATEUSER", GlobalField.getUser().getName());
addDynamic.put("XWNR", data.getBundleExtra("DYNAMIC").getString("CONTENT"));
addDynamic.put("TPID", "");
addDynamic.put("CREATEDATE", data.getBundleExtra("DYNAMIC").getString("TIME"));
// 把发布的动态插入数据库
setDynamicData(addDynamic);
}
}
}
在上面通过requestCode判断确定是我们需要的数据,就可以进行我们所需要的操作了。
写在最后
一个Activity的Fragment 和另一个Activity 进行数据传递的过程,大概就是这样子。
我是小白,有什么不对的地方,欢迎指正。