1

因此,当您离开活动设置=>开发人员选项=>不保留活动时,我启用了销毁活动的设置

这应该基本上复制一个被垃圾收集的活动或片段,然后我必须通过包保存的实例状态恢复数据。

所以我理解它是如何工作的。但是,当我从片段 1 导航到片段 2,然后将应用程序置于后台,然后置于前台(破坏活动)时,片段 1 和片段 2 似乎同时显示。其中应该只显示片段 2。

我不知道这是否是我必须管理隐藏和显示片段 onsavedinstance 的标准。或者如果我的代码中的某些东西破坏了东西。以下是我推送片段的方式,希望对您有所帮助:

public void pushFragmentWithAnimation(FragmentManager fm, int parentId, Fragment currentFrag, Fragment newFrag, int animEntry, int animExit) {
    hideSoftKeyboard(currentFrag.getActivity());
    FragmentTransaction ft = fm.beginTransaction();
    // See: http://developer.android.com/reference/android/app/FragmentTransaction.html#setCustomAnimations(int, int, int, int)
    ft.setCustomAnimations(animEntry, animExit, animEntry, animExit);
    ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);
    ft.addToBackStack(null);
    ft.commit();
}

片段 1 仍在后台堆栈中,因为当我按下返回时,我只看到片段 1。如果您知道为什么会发生这种情况,请告诉我。

4

2 回答 2

1

XML 添加的 Fragments 和以编程方式添加的 Fragments 的生命周期差异很大,以至于将它们混合在一起是个坏主意,如在此处详细解释的那样。

解决此问题的最简单方法是通过将 XML 膨胀片段替换为相同 ID 的 FrameLayout 以编程方式添加所有片段,然后在 onCreate 添加

FragmentManager fragMgr = getSupportFragmentManager();
if (null == fragMgr.findFragmentByTag(FRAG_TAG))
{
    fragMgr.beginTransaction().
        add(R.id.fragment, new Fragment1(), FRAG_TAG).commit();
}

FRAG_TAG任何唯一字符串在哪里。这确保了 Fragment1 仅在它不在布局中时才被创建。

于 2013-03-09T00:05:06.627 回答
0

我不完全确定为什么这个解决方案有效。我假设它与活动是否被杀死有关,它不会跟踪当前显示的片段并显示所有片段。所以基本上我需要更换:

ft.add(parentId, newFrag, String.format("Entry%d", fm.getBackStackEntryCount())).hide(currentFrag).show(newFrag);

ft.replace(parentId, newFrag, tag);

然后当我在主要活动中创建初始片段时。我只会在

if(savedInstanceState==null){

我更新的代码如下:https ://github.com/CorradoDev/FragmentTest/tree/2c53f9f42e835da768f61b0233f3ab5b3adf2448

于 2013-04-06T20:00:26.687 回答