Android:使用支持 fragment 管理器时复制 fragment

标签 android android-activity lifecycle fragment android-lifecycle

我对 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,并检查 savedInstanceStatenull 值。好吧,我不知道它是自动从 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/

相关文章:

android - 可以更新 fragment 而不是创建新实例吗?

java - 整个应用程序是否有一个 onPause ?

android - 如何在 Android Things 应用程序上获得语音识别?

android - 存储 View 和数据的不同方式,除了 Activity

java - 从通知中恢复 Activity

testing - QA 服务器代表什么?

android - 在加载图库之前刷新设备上的所有缩略图?

java - GC 在 BitmapFactory.decodeStream() 上过于活跃

java - 如何在Android WebView中设置比例

Android 自动启动 Activity (应用启动两次)