Fragment 和 Activity 的数据传递问题

835 阅读3分钟

写在前面

最近的项目里,遇到的朋友圈的功能,朋友圈的模块嵌套在 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 中得到携带的数据.

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

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