【发布时间】:2018-10-19 00:58:35
【问题描述】:
由于 Fragment 需要在配置更改后继续存在,Android 强烈建议我们在创建 Fragment 时实现自己的newInstance() 方法,将必要的数据传递给它的Bundle,而不是使用new MyFragment()。
现在,问题是,我想向这个 Fragment 传递一个回调(接口)。
起初我尝试将我的界面设为extends Serializable,并简单地使用args.putSerializable("myInterface", myInterface)。
但是当 Android 尝试保存它的状态(包裹它)时,会抛出一个异常(Parcelable 遇到 IOException 写入可序列化对象)。
我知道官方的做法是让调用者Activity实现回调,并在片段的onAttach()期间将回调引用到Activity。
是的,它有效,但感觉很奇怪,因为我实际上是在创建一个库,现在我没有要求用户将回调传递给构建器,而是必须告诉他们你的调用者活动必须实现某个接口。
更重要的是,如果我想从另一个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);
}
}
【问题讨论】:
-
您的接口是否使用任何不实现可序列化的对象?
-
它只是一个方法的接口。啊,但是该方法将
Uri作为参数传递。 (void onSomethingDone(Uri uri);。这有关系吗?(顺便说一句,Uri实现了Parcelable)
标签: java android android-fragments serialization interface