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



我正在构建一个针对Android 4.1及更高版本的PDF阅读器应用程序。我有一个活动,它维护两个独立的视图片段和一个保留的"headless"片段(管理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——很明显,它不应该这样做,因为PDFDocument Fragment应该被保留。

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

您的问题可能是因为您在保存活动的实例后没有调用super.onSavedInstanceStateActivity类的原始onSavedInstanceState保存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);
}

相关内容

最新更新