保持方向变化的复杂数据

时间:2014-07-18 08:26:50

标签: android persistence orientation-changes

我想知道在Android中存储复杂数据类型变量的最佳方法是什么。 onSaveInstanceState()只能用于简单的数据类型,如字符串,整数等,但如果我想保存其他内容,我该怎么办?

这些是我目前所知的方法:

  1. 将其保存在数据库中并将其还原
  2. 创建一个json并将json-string保存在数据库或共享首选项中。
  3. 使用静态变量(由于可能的内存泄漏和其他不需要的行为,不推荐使用)
  4. 让它变得可分辨
  5. 我对上述任何一种方法都不满意,所以我正在寻找一种不同的,更通用的方法。例如,如果我想保存包含片段的ArrayList,我该怎么办(让我们不讨论为什么我会这样做,让我们也假装没有像碎片管理器这样的东西)。

1 个答案:

答案 0 :(得分:0)

我相信如果你可以制作一个可分类的类,你可以在同一OnsaveInstanceState

中存储相同的内容。
@Override
protected void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);
    try
    {


        outState.putParcelable("ListViewFragment", (Parcelable) mLeftMenuFragment);
        outState.putParcelable("ProductsGridFragment", (Parcelable) mProductsGridFragment);
        outState.putParcelable("ProductDetailsFragment", (Parcelable) mProductDetailsFragment);
        outState.putParcelable("FeaturedFragment", (Parcelable) mFeaturedFragment);
        outState.putParcelable("CategoryFragment", (Parcelable) mCategoryFragment);

    }
    catch(Exception e)
    {
        mLogger.error(Logger.ERROR_CODE_API, e);
    }
}

按以下方式取回

if(savedInstanceState != null)
        {
            isFeaturedProduct = savedInstanceState.getBoolean("IsFeaturedProduct");
            mLeftMenuFragment = (LeftMenuFragment) savedInstanceState.getParcelable("ListViewFragment");
            mProductsGridFragment = (ProductListFragment) savedInstanceState.getParcelable("ProductsGridFragment");
            mProductDetailsFragment = (ProductDetailsFragment) savedInstanceState.getParcelable("ProductDetailsFragment");
            if(isFeatured)
                mFeaturedFragment = (FeaturedFragment) savedInstanceState.getParcelable("FeaturedFragment");
            else
                mCategoryFragment = (CategoryFragment) savedInstanceState.getParcelable("CategoryFragment");
            // mActionBar.setTitle(savedInstanceState.getString("ActionBarTitle"));
        }
        else
        {
            mLeftMenuFragment = new LeftMenuFragment();
            mProductsGridFragment = new ProductListFragment();
            mProductDetailsFragment = new ProductDetailsFragment();
            if(isFeatured)
            {
                mFeaturedFragment = new FeaturedFragment();
            }
            else
            {
                mCategoryFragment = new CategoryFragment();
            }
            mIsFeaturedClicked = true;
        }