【问题标题】:Handle onResume() not called when recreating fragment from backstack从后台堆栈重新创建片段时未调用处理 onResume()
【发布时间】:2015-03-08 21:13:11
【问题描述】:

我最近开始重构我的 Android 应用程序,将“所有”活动替换为片段。以现在的状态,表现比以前差了很多……

我的问题在于“向上导航”、回栈行为以及将片段置于前面时对片段进行一般“重新绘制”。

所以我在我的用户界面中创建了片段的逻辑层次结构,当用户在主菜单中时,不应该显示“向上”按钮。当用户在任何其他片段中时,向上按钮应将用户带回主菜单。

当我开始实现这个时,我只是放了一个

activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

在我的片段的 onResume 方法中。这将按预期工作,直到主菜单从后堆栈(或主页导航)置于前面。然后不调用 onResume() 方法。

当用户在应用程序的其他位置时想要“重新绘制”片段似乎是大部分开发人员想要做的事情。我已经阅读了一些解决方案,基本上包括监听 backstack 更改,然后为即将返回的片段调用 onResume()。这个解决方案感觉就像一个丑陋的黑客,你不应该在真实的应用程序中拥有。那么大型应用程序的开发人员如何处理这个问题呢?最佳做法是什么?还是我错过了一些原则,说明如何根本不把自己编码到这个角落?

我必须说,我认为 Fragment 的 Android 开发页面几乎是在说生命周期:

“管理片段的生命周期很像管理活动的生命周期”

“已恢复:片段在正在运行的活动中可见。”

此信息意味着当片段从不可见变为可见时应调用 onResume()。

另外,我提供导航的解决方案显然不正确,关于如何获得正确行为的任何提示?

感谢您的帮助!

【问题讨论】:

    标签: android android-fragments android-navigation fragment-lifecycle fragment-backstack


    【解决方案1】:

    好的,实际问题非常不清楚,所以我会尝试分解它。

    问题

    没有调用主屏幕的 onResume 方法。

    在查看活动生命周期和片段生命周期: 它突出显示“只有在调用活动 onResume() 或 onPause() 时才会调用片段 onResume() 或 onPause()。”

    Go here: 2nd paragraph

    这应该让您了解为什么主屏幕中的 onResume() 方法没有被调用。我不会自己实现这个,但为了提供解决方案,我会清除后台堆栈(为了记忆)并在用户尝试进入主屏幕/主屏幕时实例化一个新的 homeScreen Activity,或者我自己的解决方案是重写部分再次您的应用程序,您不需要为此使用片段。

    编程实践

    在使用多个片段时要小心使用一个片段,除非您对 Android API 的高技能和知识应该用于在一个屏幕上显示多个视图。用例包括更大的屏幕(表格、额外信息等)。

    已经报告了许多白屏问题,原因是用碎片轰炸应用程序并弹出到后台堆栈,所以请注意。

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多