Fragment的数据传递

开发之中用到的Fragment的次数越来越多,很多小的项目都已经直接在使用Fragment作为Activity的载体来切换页面。而在开发之中页面的切换我们最关心的问题就是数据的传递了。今天我们主要来研究下Fragment页面切换数据的传递方式。

第一种方式:Bundle传递参数

复制代码
Fragment1 fragment1 = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString("name", "张三");
fragment1.setArguments(bundle);

FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.addToBackStack(null);
transaction.add(R.id.content,fragment1);
transaction.hide(HomeFragment.this);
transaction.commit();
复制代码

这里需要注意的是,一定要现有Fragment在去使用Bundle传递参数。

接受参数就相对比较简单了,一半的时候会考虑在Fragment的onAttach生命周期里面去接受。

代码如下:

  

Bundle arguments = getArguments();
String name = arguments.getString("name");

是不是很简单了,当然我们最好还需要判断下获取的值是不是为空,因为有可能在没有网络的时候没有从服务器获取到数据,这里就会接受不到。

再来介绍第二种参数的传递方式:

  我们在商城客户端里面市场会碰到这样的需求,我们选择了购买的时候还需要指定我们的送货地址,选择发票之类的业务。这样我们就需要把另外的Fragment里面选择的结果传递到前面的Fragment里面去做相关处理。

  通常这样的情景在Activity里面一半会通过参数回传的方式

    

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        // TODO Auto-generated method stub
        super.startActivityForResult(intent, requestCode);
    }

但是在Fragment里面不推荐这么使用,在Fragment里面一般使用比较灵活的回调接口去传递参数。

  所以我们首先需要去定义一个接口,接口的代码如下:

public interface OnResultListener {
    void OnResult(String value);
}

这里的命名方式还是比较正规的,模仿的是android里面点击事件来做的。

  然后我们可以做这样的一些类操作:

      1、一个Fragment里面点击前往另外的一个Fragmengt

      2、另外的一个Fragment里面有个按钮点击会通过接口回调的方式把参数回调个第一个Fragmennt

在第二个Fragment里面我们需要定义一个方法,传递的参数就是我们前面定义的一个接口,通过this给这个接口赋值。

  

private OnResultListener listener;

    public void setListemer(OnResultListener listener) {
        this.listener = listener;
    }

然后我们可以在何时的时机去给这个接口里面的接口方法的参数传递值。

  

复制代码
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.f1_but:
            if (listener != null) {
                listener.OnResult("test");
            } else {
                Toast.makeText(getActivity(), "listener is null",
                        Toast.LENGTH_SHORT).show();
            }
            // 弹出栈
            getFragmentManager().popBackStack();
            break;

        default:
            break;
        }
    }
复制代码

这里需要的弹出栈,当我们点击确定按钮的时候就会把当前的Fragment弹出栈,去第一个Fragment里面。

由于我们最先的需求是从第一个Fragment前往第二个Fragment。所以我们还需要在第一个Fragment里面去做切换。

            FragmentManager fm = getFragmentManager();
            FragmentTransaction transaction = fm.beginTransaction();
            transaction.addToBackStack(null);
            transaction.add(R.id.content,fragment1);
            transaction.hide(HomeFragment.this);
            transaction.commit();

这里有几点需要注意的:

  1、不要使用replace期做替换,使用add方法,replace会先干掉Fragment里面的view 到时候回调回来的参数不能显示。

  2、add使用,要Hide,这样避免页面的层叠状况。

  3、注意添加到栈,这样我们就可以操作返回键了,因为Fragment是挂载到Acticity上面的,不将Fragment添加到栈,点击返回键是直接对当前的Activity做操作

    如果当前只有一个Activity是会直接退出当前APP的

本来向附上源码的,但是无奈找不到在哪上传附件,忧伤啊!

原文地址:https://www.cnblogs.com/likeju/p/4835114.html