我正在构建面向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。
活动的已保存实例状态与保留的片段之间是否存在某种冲突?我做错了什么?
答案 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);
}