繁体   English   中英

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

[英]Retained fragments not retained with saved instance state in Android activity

我正在构建一个针对Android 4.1及更高版本的PDF阅读器应用程序。 我有一个活动,其中维护两个单独的视图片段和一个保留的“无头”片段(用于管理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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM