Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用onSaveInstanceState在我的片段上保存和恢复接口_Android_Fragment_Parcelable_Serializable - Fatal编程技术网

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,因此您必须小心处理可能比活动寿命长的异步任务。