写在前面
最近的项目里,遇到的朋友圈的功能,朋友圈的模块嵌套在 Fragment 中,在发布动态时,跳转到另一个 Activity,发布后返回到这个 Fragment。返回之后,我没有请求后台去刷新,而是把用户发布的动态相关信息,通过 Intent 携带返回到 Fragment。
相关文件
- 包含 Fragment 的 Activity,InformixActivity
- 发布填写动态信息的 Activity,AddDynamicActivity
- 朋友圈所在的 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 中得到携带的数据.
- 在 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 进行数据传递的过程,大概就是这样子。
我是小白,有什么不对的地方,欢迎指正。