如何在不实现parcelable的情况下保存自定义对象onSaveInstanceState

时间:2014-10-27 07:14:41

标签: android bundle parcelable

我需要保存我在片段中使用的自定义对象,以便在屏幕旋转时不会丢失(当应用程序调用onDestroy然后调用onCreate时)

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

这是一种非常乏味的做事方式。

有没有办法像“putObject”方法一样传递对象?

3 个答案:

答案 0 :(得分:3)

您可以将数据保存为片段,并在配置更改期间保留,例如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);

答案 1 :(得分:1)

最好的方法是实施Parcelable(更快)。

更简单(不高效)的方法是实现Serializable并将对象添加到bundle中作为serializable。

答案 2 :(得分:-1)

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

1)创建一个扩展Application类的类,在其中添加一个对象的arrayList。 在onSaveInstanceState调用内:

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

使用putInt保存包内的Object索引。

在方法onReturnestoreInstanceState中提取它。

2)我最不喜欢的一个:

android会自动保存其视图的状态 因此,保存对象的方法是创建一个视图,将其可见性设置为none,这样它就不会在屏幕上显示,然后使用方法将我们想要的每个对象添加到视图中:

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

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

遗憾的是,我找不到更简单的保存对象的方法

希望这个可以帮助你(在我的应用程序中我最终使用第一种方法)