由于 Fragment 需要在配置更改后继续存在,Android 强烈建议我们newInstance()在创建 Fragment 时实现自己的方法,将必要的数据传递给它,Bundle而不是使用new MyFragment().
现在,问题是,我想向这个 Fragment 传递一个回调(接口)。
起初我尝试制作我的界面extends Serializable,并简单地使用args.putSerializable("myInterface", myInterface).
但是当 Android 尝试保存它的状态(包裹它)时,会抛出一个异常(Parcelable 遇到 IOException 写入可序列化对象)。
我知道这样做的官方方法是让调用者Activity实现回调,并将回调引用到onAttach()片段的活动期间。
是的,它有效,但感觉很奇怪,因为我实际上是在创建一个库,现在我没有要求用户将回调传递给构建器,而是必须告诉他们你的调用者活动必须实现某个接口。
更重要的是,如果我想Fragment从另一个人那里展示这个Fragment怎么办?onAttach()总是附加到一个Activity.
那么,有没有一种方法可以让用户将回调传递给片段,并且能够在配置更改(例如设备旋转)中幸存下来?
更新
根据要求,这是我要传递的界面:
public interface OnImageSelectedListener extends Serializable {
void onImageSelected (String uri);
}
以及我如何构建这个接口:
new OnImageSelectedListener() {
@Override
public void onSingleImageSelected(String uri) {
Glide.with(MainActivity.this).load(uri).into(ivImage);
}
}