当我尝试在主要 Activity 中保存 fragment 的状态时,出现以下错误:
java.lang.IllegalStateException: Fragment MarketviewFragment{c5e0f0d} is not currently in the FragmentManager
at androidx.fragment.app.FragmentManagerImpl.putFragment(FragmentManager.java:923)
at com.shoob.capstone.android.crypfolio.MainActivity.onSaveInstanceState(MainActivity.java:308)
at android.app.Activity.performSaveInstanceState(Activity.java:1608)
at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1443)
at android.app.ActivityThread.callActivityOnSaveInstanceState(ActivityThread.java:5038)
at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:4372)
at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:4986)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4922)
at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:69)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6986)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
在我的主要 Activity 中,我有 4 个可能的 fragment ,一次仅显示一个。我在主要 Activity 中保留对 fragment 的引用并根据需要显示它们:
private MarketviewFragment marketviewFragment;
private WatchlistFragment watchlistFragment;
private PortfolioFragment portfolioFragment;
private DetailsFragment detailsFragment;
我使用以下代码设置当前显示的 fragment (一次仅显示一个 fragment ):
//fragment is an instance of one of the 4 types of fragments above
private void setFragment(Fragment fragment) {
FragmentManager fm = getSupportFragmentManager();
if (fm.findFragmentById(R.id.frag_main) != null) {
fm.beginTransaction()
.replace(R.id.frag_main, fragment)
.commit();
} else {
fm.beginTransaction()
.add(R.id.frag_main, fragment)
.commit();
}
}
这是我设置每个 fragment 的方式(一个示例,其他类型相同):
private void setPortfolioFragment() {
if (portfolioFragment == null) {
portfolioFragment = PortfolioFragment.newInstance();
}
setFragment(portfolioFragment);
}
现在回答我的问题。如何保存所有这些 fragment 的状态?我想将它们全部保存在一个 bundle 中,以便我可以在重新创建主要 Activity 时恢复它们(例如轮换)。
我现在的方法似乎不起作用,正确的方法是什么?
保存状态:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (marketviewFragment != null) {
getSupportFragmentManager().putFragment(outState, KEY_BUNDLE_MARKETVIEW_FRAGMENT, marketviewFragment);
}
if (watchlistFragment != null) {
getSupportFragmentManager().putFragment(outState, KEY_BUNDLE_WATCHLIST_FRAGMENT, watchlistFragment);
}
if (portfolioFragment != null) {
getSupportFragmentManager().putFragment(outState, KEY_BUNDLE_PORTFOLIO_FRAGMENT, portfolioFragment);
}
if (detailsFragment != null) {
getSupportFragmentManager().putFragment(outState, KEY_BUNDLE_DETAILS_FRAGMENT, detailsFragment);
}
}
恢复状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
marketviewFragment = (MarketviewFragment)getSupportFragmentManager().getFragment(savedInstanceState, KEY_BUNDLE_MARKETVIEW_FRAGMENT);
watchlistFragment = (WatchlistFragment)getSupportFragmentManager().getFragment(savedInstanceState, KEY_BUNDLE_WATCHLIST_FRAGMENT);
portfolioFragment = (PortfolioFragment)getSupportFragmentManager().getFragment(savedInstanceState, KEY_BUNDLE_PORTFOLIO_FRAGMENT);
detailsFragment = (DetailsFragment)getSupportFragmentManager().getFragment(savedInstanceState, KEY_BUNDLE_DETAILS_FRAGMENT);
}
}
最佳答案
每次分离 fragment 时都应该保存它。
另外请在 fragmentManager
replace
另一件事是 FragmentManager
应该自行恢复 fragment 。就我个人而言,我会使用 FragmentPagerAdapter
来完成此操作,然后只切换可见的一个。
最好和最简单的方法是将所有 fragment 附加到 FragmentManager,并仅控制可见性。由于保存/恢复将自动完成
关于java - 在 Activity 中保存 fragment 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323308/