Fragment 和 Activity 的数据传递问题

写在前面

最近的项目里,遇到的朋友圈的功能,朋友圈的模块嵌套在Fragment中,在发布动态时,跳转到另一个Activity,发布后返回到这个Fragment。返回之后,我没有请求后台去刷新,而是把用户发布的动态相关信息,通过Intent携带返回到Fragment。

相关文件

1.包含Fragment的Activity,InformixActivity
2.发布填写动态信息的Activity,AddDynamicActivity
3.朋友圈所在的Fragment,ForumFragment

业务流程

用户在朋友圈的Fragment,点击ActionBar上面的发布按钮。
跳转到动态填写页面,AddDynamicActivity ,在该页面填写完成后,点击发布或者取消,返回到朋友圈Fragment。
在返回Fragment的时候,数据,要通过 InformixActivity ,才能成功传递过去。

主要代码

  1. 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方法,后面会说。

  1. 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” 的值进行判断。

  1. 携带结果返回到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 进行数据传递的过程,大概就是这样子。

我是小白,有什么不对的地方,欢迎指正。

猜你喜欢

转载自blog.csdn.net/A_Intelligence/article/details/85005990