android - Android Activity 中保存的实例状态未保留的保留 fragment

标签 android pdf android-fragments

我正在构建一个针对 Android 4.1 及更高版本的 PDF 阅读器应用程序。我有一个维护两个单独的 View fragment 和一个保留的“ headless ” fragment (管理 pdf 文档状态)的 Activity 。因为我不想每次发生配置更改时都必须重新读取 PDF 文档,所以文档状态 fragment 使用了 setRetainInstance:

public class PDFDocumentFragment extends Fragment
{

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

所有这些都是支持 fragment ,因此拥有的 Activity 实际上是一个 FragmentActivity。直到最近,这一直运行良好,在配置更改时保留 PDFDocumentFragment 中的状态,但我只是通过覆盖 Activity 中的 onSaveInstanceState 向我的 Activity 添加了一些保存的实例状态:

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 只是一个指示 View 类型的枚举 - 显示的是文本还是原始 PDF。

问题:

如上所述将保存的实例状态添加到 Activity 后,在配置更改后我不再取回原始保留的 fragment ,即 Activity 中的这段代码:

@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 应该被保留。

为 Activity 保存的实例状态和保留的 fragment 之间是否存在某种冲突?我做错了什么?

最佳答案

您的问题可能是因为您在保存 Activity 实例后没有调用 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);
}

关于android - Android Activity 中保存的实例状态未保留的保留 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021479/

相关文章:

android - 如何在 Android 中将 getview() 与 SimpleAdapter 一起使用?

android - 将 Android Activity 设置为全屏

javascript - 使用 express js 在浏览器中显示 Pdf

pdf - 我应该在我的站点地图文件中列出 PDF 吗?

Android Honeycomb : How to change Fragments in a FrameLayout, 没有重新创建它们?

java - JUnit 测试列表内映射的内容

java - 没有数据库的简单 Jasper 报告

android - 在 MapView fragment 上放置自动完成小部件

android - 如何管理 PreferenceFragment 中的分隔符?

android - 使用 Xamarin Android 与客户端证书进行 SSL 通信