如何保存自定义的onSaveInstanceState对象,而不执行parcelable

问题描述:

我需要保存,我在一个片段使用,所以它不会丢失自定义对象当屏幕旋转时(当应用程序调用的onDestroy然后召回的onCreate)如何保存自定义的onSaveInstanceState对象,而不执行parcelable

现在正常的做法是实现Parcelable接口并将其作为Parcelable对象保存到包中。

这是一个非常繁琐的做事方式。

有没有一种方法可以像“putObject”方法一样传递对象?

以及搜索,我发现这样做的没有正式的方式,所以这里有两个“黑客”我发现身边的问题:

1)创建一个扩展应用程序类,在其添加对象的ArrayList类。 电话的onSaveInstanceState里面:

getApplication().getObjectArray().add(YourObject); 

保存使用putInt捆里面的对象指数。

将它解压缩到方法onReturnestoreInstanceState中。

2)我不太喜欢的一个:

机器人会自动保存其观点 和各州为此,以此来拯救的对象将是创建一个视图设置它的知名度没有那么它不会显示在屏幕上那么,我们希望每个对象添加到使用方法的观点:

view.setTag(key,Object); or view.setTag(Object); 

现在里面onReturnestoreInstanceState获取视图并提取标签。

不幸的是我无法找到保存对象

希望更简单的方式这一个可以帮助你(在我的应用我结束了使用第一种方法)

+1

你好,哈克先生! – 2015-12-10 09:57:00

+0

我不会认为这种方法是可读和可维护的,KISS! – Eido95 2016-11-22 22:18:27

最好的办法是实行Parcelable(更快)。

更简单(效率不高)的方法是实现Serializable并将该对象作为可序列化添加到捆绑包中。

+0

必须为您传递的每个对象执行parcelable,如果您需要传递几个由多个字段或子对象组成的对象,则必须执行大量工作。 – 2014-10-27 07:59:35

+0

同意。如果你需要一个更简单的解决方案,你可以实现Serializable接口。它虽然效率不高。 – km86 2014-10-27 08:01:07

+0

这就是为什么最后我一起避免了这个问题,并在应用程序类中创建了对象数组,我将它用作itermediate,因为它应该是可用的,除非应用程序已关闭,我存储该对象,然后从中抽取if没有任何喧嚣 – 2014-10-27 08:06:25

您可以将数据保存在碎片中,在配置更改期间保留,如example

扩展Fragment类并声明对有状态 对象的引用。

public class RetainedFragment extends Fragment { 
    // data object we want to retain 
    private MyDataObject data; 
    // this method is only called once for this fragment 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // retain this fragment 
     setRetainInstance(true); 
    } 
    .. getter and setter 
} 

然后使用FragmentManager的片段添加到活动中。

public class MyActivity extends Activity { 

    private RetainedFragment dataFragment; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ..  
     // find the retained fragment on activity restarts 
     FragmentManager fm = getFragmentManager(); 
     dataFragment = (RetainedFragment) fm.findFragmentByTag(“data”); 

     // create the fragment and data the first time 
     if (dataFragment == null) { 
      // add the fragment 
      dataFragment = new DataFragment(); 
      fm.beginTransaction().add(dataFragment, “data”).commit(); 
     } else { 
      // available dataFragment.getData() 
      .. 
      // save data in onDestroy dataFragment.setData(yourData); 
+0

虽然这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – 2015-07-18 07:37:45

+0

感谢U 4的建议。我会尝试) – 2015-07-18 12:12:20