06_Android Fragment 与 宿主 Activity 间值传递

1. Activity 传值到 Fragment


1.1 set/getArguments() 方法

就像 Activity 之间通过 Intent.set/getExtral() 方法传递/接收值类似,
我们在宿主 Activity 中

 ...
 Bundle bundle = new Bundle();
 bundle.putString("key", "value");
 fragment.setArguments(bundle);

在 Fragment 中

String value = getArguments().getString("key");
...

1.2 newInstance() 方法

这种方法只是上一种方法变换了另一种形式。

在 Fragment 中,定义 newInstance() 实例

public static MyFragment newInstance(String value) {
        Bundle bundle = new Bundle();
        bundle.putString("key", value);
        MyFragment fragment = new MyFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

在宿主 Activity 中,通过 newInstance() 方法创建 Fragment,并传递 value 值。

MyFragment fragment = MyFragment.newInstance("0");
...

在 Fragment 中,还是和第一种方法一样获取传递过来的值

String value = getArguments().getString("key");
...

需要注意的是,Activity 在一些特殊状况下会发生 destroy 并重新 create 的情形,比如屏幕旋转、内存吃紧时;对应的,依附于 Activity 存在的 Fragment 也会发生类似的状况。而一旦重新 create 时,Fragment 便会调用默认的无参构造函数,导致无法执行有参构造函数进行初始化工作。所以这种方法还是有瑕疵的。

1.3 暴露公开的值获取方法

在宿主 Activity 中,将要传递的参数通过定义一个有公开的返回值的方法

    private int value;
    ...
    public int getValue() {
        return value;
    }
    ...

在 Fragment 的 onAttach() 方法中通过强转成宿主 Activity,调用公开的方法获取值

 @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        // 通过强转成宿主 Activity
        int value = ((MainActivity)context).getValue();
    }

但是这个方法使得 Fragment 与宿主 Activity 绑定在了一起, Fragment 无法复用到其它 Activity,这违背了 Fragment 设计的初衷。

2. Fragment 传值到宿主 Activity


2.1 接口回调的方法

在 Fragment 中定义一个接口

    public interface MyCallBack {
        void callback(String content);
    }

在 Fragment 中 onAttach() 方法中实例化这个接口


private MyCallBack myCallBack;
...
@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        myCallBack = (MyCallBack)context; // 实例化对象
    }

在 Fragment 中需要传递值的地方,引用接口的方法

 @Override
    public void onClick(View view) {
        myCallBack.callback(textView.getText().toString());
    }

在宿主 Activity 中实现这个接口,实现接口回调

    // 接口回调
    @Override
    public void callback(String content) {
        Toast.makeText(this,content, Toast.LENGTH_SHORT).show();
    }

还有一点需要注意的就是在 Fragment 中

    //把传递进来的 activity 对象释放掉
    @Override
    public void onDetach() {
        super.onDetach();
        myCallBack = null;
    }

你可能感兴趣的:(06_Android Fragment 与 宿主 Activity 间值传递)