Android 如何使用onSaveInstanceState在我的片段上保存和恢复接口
当我的片段重新加载时,我需要恢复变量。除我的回调外,所有其他变量都在工作Android 如何使用onSaveInstanceState在我的片段上保存和恢复接口,android,fragment,parcelable,serializable,Android,Fragment,Parcelable,Serializable,当我的片段重新加载时,我需要恢复变量。除我的回调外,所有其他变量都在工作 05-25 12:04:06.037: E/AndroidRuntime(10822): FATAL EXCEPTION: main 05-25 12:04:06.037: E/AndroidRuntime(10822): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = br
05-25 12:04:06.037: E/AndroidRuntime(10822): FATAL EXCEPTION: main
05-25 12:04:06.037: E/AndroidRuntime(10822): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = br.com.closet4share.app.adapters.AppSectionsPagerAdapter$1)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeSerializable(Parcel.java:1279)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeValue(Parcel.java:1233)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeMapInternal(Parcel.java:591)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Bundle.writeToParcel(Bundle.java:1627)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeBundle(Parcel.java:605)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:135)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeTypedArray(Parcel.java:1102)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:378)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeParcelable(Parcel.java:1254)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeValue(Parcel.java:1173)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeMapInternal(Parcel.java:591)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Bundle.writeToParcel(Bundle.java:1627)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeBundle(Parcel.java:605)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2535)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3151)
我有这样一个片段:
公共类ClosetFragment扩展了片段{
private String [] closetSessions = null;
private DBName dbName = null;
private String token = null;
private RefreshCallback callback= null;
public ClosetFragment(String [] closetSessions, DBName dbName, String token, RefreshCallback callback){
this.closetSessions = closetSessions;
this.dbName = dbName;
this.token = token;
this.callback = callback;
}
public ClosetFragment(){
}
@Override
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("closetSessions", (Serializable) this.closetSessions);
outState.putSerializable("dbName", (Serializable) this.dbName);
outState.putSerializable("token", (Serializable) this.token);
outState.putSerializable("callback", (Serializable) this.callback);
}
我的回电是:
public interface RefreshCallback extends Serializable{
public void onNeedrefresh();
}
我得到的例外是:
AppSectionsPagerAdapter是实现回调的类
05-25 12:04:06.037: E/AndroidRuntime(10822): FATAL EXCEPTION: main
05-25 12:04:06.037: E/AndroidRuntime(10822): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = br.com.closet4share.app.adapters.AppSectionsPagerAdapter$1)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeSerializable(Parcel.java:1279)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeValue(Parcel.java:1233)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeMapInternal(Parcel.java:591)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Bundle.writeToParcel(Bundle.java:1627)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeBundle(Parcel.java:605)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:135)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeTypedArray(Parcel.java:1102)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:378)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeParcelable(Parcel.java:1254)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeValue(Parcel.java:1173)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeMapInternal(Parcel.java:591)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Bundle.writeToParcel(Bundle.java:1627)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.os.Parcel.writeBundle(Parcel.java:605)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2535)
05-25 12:04:06.037: E/AndroidRuntime(10822): at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3151)
非常感谢你的帮助
以下是我实现回调的方式:
@Override
public Fragment getItem(int i) {
Fragment fragment = null;
fragment = new ClosetFragment(i,closetSessions,dbName,token, new RefreshCallback(){
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void onNeedrefresh() {
AppSectionsPagerAdapter.this.notifyDataSetChanged();
}
});
mPageReferences.put(i, new WeakReference<Fragment>(fragment));
return fragment;
}
@覆盖
公共片段getItem(int i){
片段=空;
fragment=newclosetFragment(i,closetSessions,dbName,token,newrefreshcallback(){
/**
*
*/
私有静态最终长serialVersionUID=1L;
@凌驾
公共空间{
AppSectionsPagerAdapter.this.notifyDataSetChanged();
}
});
mPageReferences.put(i,新WeakReference(fragment));
返回片段;
}
公共类MainActivity扩展活动实现AddToDoFragment.OnToDoAddedListener{
私人ArrayList todoItems;
专用阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
如果(savedInstanceState==null){
todoItems=新的ArrayList();
}否则{
todoItems=savedInstanceState.getStringArrayList(“todoItemTag”);//标记必须与保存变量的内容匹配
}
FragmentManager fm=getFragmentManager();
ToDoListFragment listToDo=新的ToDoListFragment();
listToDo=(ToDoListFragment)fm.findFragmentById(R.id.list\u view\u fragment);
adapter=newarrayadapter(这是android.R.layout.simple\u list\u item\u 1,todoItems);
setListTodo.setListAdapter(适配器);
}
已添加公共void(字符串newToDo){
todoItems.add(newToDo);
adapter.notifyDataSetChanged();
}
@凌驾
SavedInstanceState上的受保护空隙(束超出状态){
super.onSaveInstanceState(超出状态);
putStringArrayList(“todoItemTag”,todoItems);//建议将标记设置为静态最终字符串
}
}
您需要重写onSavedInstanceState方法,以便知道何时需要保存状态。然后还需要更新onCreate方法以检查savedInstanceState是否为null。如果为null,则活动尚未启动。这是MainActivity类的示例,您可以从那里开始:出现异常是因为匿名内部类包含父适配器的成员变量-这是您通过
AppSectionsPagerAdapter访问的变量。这是,并且适配器不可序列化
您不能以这种方式持久化回调,老实说,您甚至不应该尝试这样做。只持久化片段的内部数据,并在getItem
中单独设置回调。在我的活动中,我创建了以下方法:
public void refreshAdapter(){
if (mAppSectionsPagerAdapter != null)
mAppSectionsPagerAdapter.notifyDataSetChanged();
}
在我的片段中有一个调用:
Closet closet = (Closet)getActivity();
closet.refreshAdapter();
不需要保存任何内容。谢谢@vzsg。您可以在示例中编辑您如何使用实例化此回调
?例如AppSectionsPagerAdapter
中的实现。您好,savedInstanceState不为null,即使我没有签入此代码,活动也已启动。问题是如何保存和恢复我的状态回调?我如何放置它并从savedInstanceState中检索它?但是当片段暂停并恢复时,它不会调用getItem。而且我对回调的引用丢失了。因此,如果我要更改此ArhitArchitecture,我如何才能告诉我的adpter从片段内部通知DatasetChanged?@Vzsgt这也有效。需要注意的一点是getActivity()
如果片段被分离,可能会返回null,因此您必须小心处理可能比活动寿命长的异步任务。