在我的申请中,我有一个活动。该活动有5个片段。每个片段占据整个窗口,任何时候只会显示其中一个片段。
从第五个片段我打开相机拍照。由于我打开相机,在某些手机中,活动被杀死并重新创建。
拍摄照片后,结果将显示在新创建的活动中。但由于这是一个新创建的,这个显示第一个片段而不是第五个片段。
如何在保持状态的情况下显示第五个片段?只有在配置更改时重新创建了Activity时,setRetainInstance才有用。
主要问题是,当时活动娱乐,那些碎片'调用默认构造函数并导致所有片段的重复实例。
答案 0 :(得分:1)
尝试在onSaveInstanceState()中保存片段状态,并在onCreate内部使用它来恢复状态。
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "fragment", currentFragment);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
// Load saved fragment or values you want
currentFragment = getSupportFragmentManager().getFragment(savedInstanceState, "fragment");
} else {
// your code to initialize all the fragments (App Launch case)
}
}
这仍将保持状态,并将回调onActivityResult。
答案 1 :(得分:0)
How can I show the fifth Fragment with maintaining its state? setRetainInstance is useful only if the Activity got recreated on configuration changes.
作为提到的答案之一,您可以仅使用索引并将其保存在onSaveInstanceState中,然后在以后使用。
The main problem is, at that time Activity recreation, those fragments' default constructor gets called and resulting in duplicate instance of all fragments.
它是默认行为。系统破坏了您的片段,系统将使用默认构造函数再次创建它们。如果您还创建新的片段,则会发生重复。为避免这种情况,只需检查片段管理器中是否已存在片段。
例如
if(getSupportFragmentManager().findFragmentByTag(tag5th) == null)
create your fragment and add in fragment transaction
else
use this fragment from fragment manager