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;
}