我正在构建一个针对 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.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);
}
关于android - Android Activity 中保存的实例状态未保留的保留 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021479/