我对 fragment 有一个非常奇怪的问题。我使用最新的支持库。我还使用了与 Google 在其 IOSCHED project 中使用的类似代码
但是我在旋转后重新创建 Activity 时遇到问题。在 Activity 被销毁并再次创建后,我调用用于管理 fragment 事务的方法(在 onStart 方法中)。该行仅被调用一次,但它创建了两次 fragment !
这是我的 Activity 方法:
public abstract class SinglePaneActivity extends FragmentActivity
{
@Override
protected void onStart()
{
super.onStart();
if(mFragment == null)
{
mFragment = onCreatePane();
mFragment.setArguments(Utils.intentToFragmentArguments(getIntent()));
Log.w(TAG, "Fragment creation counter = " + createCounter);
createCounter++;
getSupportFragmentManager()
.beginTransaction()
.add(R.id.root_container,mFragment)
.commit();
}
}
@Override
protected void onStop()
{
Log.i(TAG, "onStop");
if(mFragment != null)
{
getSupportFragmentManager()
.beginTransaction()
.remove(mFragment)
.commit();
mFragment = null;
}
super.onStop();
}
}
和我的日志:
--Start of application--
11-18 13:26:37.050: I/SinglePaneActivity(19040): onCreate
11-18 13:26:37.050: I/SinglePaneActivity(19040): onStart
11-18 13:26:37.055: W/SinglePaneActivity(19040): replacing fragment, counter = 1
11-18 13:26:37.075: I/MyFragment(19040): onCreate
11-18 13:26:37.110: I/MyFragment(19040): onActivityCreated
--Rotating the device--
11-18 13:26:39.600: I/SinglePaneActivity(19040): onStop
11-18 13:26:39.600: I/SinglePaneActivity(19040): onDestroy
11-18 13:26:39.605: I/MyFragment(19040): onDestroy
11-18 13:26:39.755: I/MyFragment(19040): onCreate
11-18 13:26:39.755: I/SinglePaneActivity(19040): onCreate
11-18 13:26:39.790: I/MyFragment(19040): onActivityCreated
11-18 13:26:39.800: I/SinglePaneActivity(19040): onStart
11-18 13:26:39.800: W/SinglePaneActivity(19040): replacing fragment, counter = 2
11-18 13:26:39.810: I/MyFragment(19040): onCreate
11-18 13:26:39.815: I/MyFragment(19040): onActivityCreated
--Rotating the device back--
11-18 13:36:47.060: I/SinglePaneActivity(19040): onStop
11-18 13:36:47.060: I/SinglePaneActivity(19040): onDestroy
11-18 13:36:47.060: I/MyFragment(19040): onDestroy
11-18 13:36:47.065: I/MyFragment(19040): onDestroy
11-18 13:36:47.130: I/MyFragment(19040): onCreate
11-18 13:36:47.130: I/MyFragment(19040): onCreate
11-18 13:36:47.130: I/SinglePaneActivity(19040): onCreate
11-18 13:36:47.140: I/MyFragment(19040): onActivityCreated
11-18 13:36:47.150: I/MyFragment(19040): onActivityCreated
11-18 13:36:47.150: I/SinglePaneActivity(19040): onStart
11-18 13:36:47.150: W/SinglePaneActivity(19040): replacing fragment, counter = 3
11-18 13:36:47.160: I/MyFragment(19040): onCreate
11-18 13:36:47.160: I/MyFragment(19040): onActivityCreated
--Exiting the app--
11-18 13:36:48.880: I/SinglePaneActivity(19040): onStop
11-18 13:36:48.885: I/SinglePaneActivity(19040): onDestroy
11-18 13:36:48.885: I/MyFragment(19040): onDestroy
11-18 13:36:48.890: I/MyFragment(19040): onDestroy
11-18 13:36:48.890: I/MyFragment(19040): onDestroy
因此每次旋转后 fragment 的数量都在增加。
旋转后,它会在 fragment 转到我的 onStart 方法之前恢复该 fragment ,而我的 onStart 方法会在同一个框架布局容器中创建第二个相同的 fragment 。但是它在哪里恢复第一个 fragment ?我想禁止它。或者我应该改变我的“如果”来测试它是否已经创建?但我不知道如何确定它。看起来空测试没有用。
我还通过用 replace()
替换 add()
方法做了一些小的解决方法。之后, fragment 的数量不再增长,每个 fragment 都在 onStart
方法中创建新 fragment 之前被销毁。但这在某些 fragment 中造成了严重的问题,在这些 fragment 中我在他们的 onCreate 方法中启动了一些后台进程...
请帮帮我……我真的不知道该怎么办。非常感谢您的任何建议或想法!
最佳答案
好吧,我找到了解决方案。我不得不将带有 fragment 管理器的代码从 onStart 移动到 onCreate,并检查 savedInstanceState
的 null
值。好吧,我不知道它是自动从 savedInstanceState
保存和恢复的。很高兴知道!
编辑: 并完全正确地做到这一点,即当 savedInstanceState 不为空时恢复 fragment ,应该有:
if(savedInstanceState == null)
{
mFragment = onCreatePane();
mFragment.setArguments(Utils.intentToFragmentArguments(getIntent()));
getSupportFragmentManager()
.beginTransaction()
.add(R.id.root_container,mFragment)
.commit();
}
else
{
mFragment = getSupportFragmentManager().findFragmentById(R.id.root_container);
}
关于Android:使用支持 fragment 管理器时复制 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8182862/