保留的片段未在Android活动中保存为已保存的实例状态

时间:2014-09-24 16:00:24

标签: android pdf android-fragments

我正在构建面向Android 4.1及更高版本的PDF阅读器应用。我有一个活动,维护两个单独的视图片段和一个保留的无头' fragment(管理pdf文档状态)。因为每次配置更改发生时我都不想重新读取PDF文档,所以文档状态片段使用setRetainInstance:

public class PDFDocumentFragment extends Fragment
{

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);
       setRetainInstance(true); 

所有这些都是支持片段,因此拥有活动实际上是FragmentActivity。直到最近这一点运行良好,在配置更改中保留PDFDocumentFragment中的状态,但我只是通过覆盖活动中的onSaveInstanceState将一些已保存的实例状态添加到我的活动中:

public class ReaderControllerActivity extends FragmentActivity
{
    public static final String STATE_KEY_READER_LAYOUT = "readerLayout";

    private ReaderLayout mCurrentLayout;

    @Override
    protected void onSaveInstanceState(Bundle savedInstanceState)
    {   
        savedInstanceState.putString(STATE_KEY_READER_LAYOUT, mCurrentLayout.toString());
    }

ReaderLayout只是一个枚举,表示视图的类型 - 显示文本或原始PDF。

问题:

如上所述将保存的实例状态添加到活动后,我不再在配置更改后返回原始保留的片段,即活动中的此代码:

@Override
protected void onResume()
{
    super.onResume();
    PDFDocumentFragment pdfFragment = (PDFDocumentFragment)getSupportFragmentManager().findFragmentByTag(PDF_DOC_FRAGMENT_TAG);

        if( pdfFragment == null )
        {
            getSupportFragmentManager().beginTransaction()  
                .add(PDFDocumentFragment.newInstance(), PDF_DOC_FRAGMENT_TAG)
                .commit();
        }
在配置更改后调用onResume时,

将添加一个全新的PDFDocumentFragment - 显然它不应该这样做,因为应该保留PDFDocumentFragment。

活动的已保存实例状态与保留的片段之间是否存在某种冲突?我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的问题可能是因为您在保存活动的实例后没有致电super.onSavedInstanceState; onSavedInstanceState类的原始Activity会保存Fragment的状态:

protected void onSaveInstanceState(Bundle outState) {
    outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
    Parcelable p = mFragments.saveAllState();
    if (p != null) {
        outState.putParcelable(FRAGMENTS_TAG, p);
    }
    getApplication().dispatchActivitySaveInstanceState(this, outState);
}