我正在构建一个针对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.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);
}