使用replace时,Fragment没有调用onPause或onStop方法

8

我遇到了一个奇怪的问题,当我用另一个Fragment替换它时,我的Fragment没有调用任何结束生命周期方法,例如onPause和onStop。 我是这样替换Fragment的:

public static void replaceFragment(Activity activity, int layoutId, Fragment fragment, String title, String shortTitle) {
    FragmentTransaction transaction = activity.getFragmentManager().beginTransaction().replace(layoutId, fragment);
    transaction.addToBackStack(title);
    transaction.setBreadCrumbTitle(title);
    transaction.setBreadCrumbShortTitle(shortTitle);
    transaction.commit();
    activity.getFragmentManager().executePendingTransactions();     
}

我认为它以某种方式保持着我的片段活着,即使我执行popBackStack操作,在此之后再次替换相同的片段,之前已经显示过一次,然后它也调用onStop而不是onStart?


你在代码中哪里调用这个方法? - GrIsHu
它是一个抽象类。 - JWqvist
你能给我们展示一个受影响片段的代码吗?它的onPause()方法有@ Override指令吗? - Pork 'n' Bunny
使用FragmentManager.enableDebugLogging(true)启用日志记录,看看是否显示任何有用的信息。 - Delyan
它有@ Override,而DebugLogging告诉我与我的问题相同:( - JWqvist
2
你是否覆盖了生命周期方法(在你的Activity或Fragment类中),同时忘记委托调用super?你提供的代码片段没有问题,所以问题可能出现在宿主Activity或其中一个Fragment类中。如果没有更多详细信息,恐怕将无法进一步确定确切的问题。 - MH.
2个回答

6

问题已经解决 :)

这是由于我的平板上的应用程序在一个主要片段中添加了两个片段,当我替换包含这两个其他片段的片段时,它们的onPause和onStop没有被调用。通过在主片段的onStop中调用它们的onStop,我解决了这个问题。

感谢大家的帮助,我不知道我使用的方法并不是真正的问题,而是子片段不随其父级一起销毁!


2

在抽象类中使用您的确切代码,我无法复制此问题。我创建了一个抽象类ReplaceFragment

我的Main类扩展了FragmentActivity并为片段设置了内容视图。

在片段类内部,我设置了一个ListView。当单击列表项时,我执行以下操作:

      getListView().setItemChecked(index, true);

      // Check what fragment is currently shown, replace if needed.
      DetailsFragment details = (DetailsFragment) getFragmentManager().findFragmentById(R.id.details);
      if (details == null || details.getShownIndex() != index) {
        details = DetailsFragment.newInstance(index);
        
        ReplaceFragment.replaceFragment(...);
      }

每次点击后,我的LogCat输出如下:

10-07 12:19:07.688: V/FragmentManager(861): remove: DetailsFragment{40527d48 #1 id=0x7f040003} nesting=2

10-07 12:19:07.688: V/FragmentManager(861): movefrom RESUMED:DetailsFragment{40527d48 #1 id=0x7f040003}

10-07 12:19:07.688: E/DetailsFragment(861): Details onPause()

10-07 12:19:07.688: V/FragmentManager(861): movefrom STARTED: DetailsFragment{40527d48 #1 id=0x7f040003}

10-07 12:19:07.688: E/DetailsFragment(861): Details onStop()

10-07 12:19:07.699: V/FragmentManager(861): movefrom STOPPED: DetailsFragment{40527d48 #1 id=0x7f040003}

请提供更多实现细节以便我们能够更好地帮助您。

当Activity的onPause或onStop被调用时,片段的onPause和onStop也会被调用。但是当我替换它时不会被调用。 - JWqvist
如果您提供额外的源代码,我将很高兴测试您的确切用例。 - Mike P.
我在屏幕左侧的菜单中的onClick方法中调用该方法。 - JWqvist
我记得它以前可以工作,现在却不行了。某些东西已经破坏了它,问题是为什么。这与清单或片段管理器有关吗?感谢您的帮助,但似乎是一个更深层次的问题 :( - JWqvist
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/38729/discussion-between-mike-and-jeppe-andersen - Mike P.
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接