从后退堆栈重新创建片段时未调用 onResume() 句柄



我最近开始重构我的Android应用程序,用片段替换"all"活动。在现在的状态下,它的行为比以前糟糕得多......

我的问题在于"向上导航"、后退行为以及当碎片被带到前面时对碎片的一般"重新绘制"方面。

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

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

activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

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

我必须说,我认为 Android 开发页面的片段几乎是在对生命周期撒谎:

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

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

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

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

感谢您的帮助!

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

问题

未调用主屏幕的恢复方法。

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

转到此处:第 2 段

这应该会让你对为什么主屏幕中的 onResume() 方法没有被调用有一个很好的了解。我不会自己实现这一点,但为了给出解决方案,我会清除后退堆栈(为了内存起见)并在用户尝试进入主屏幕/主屏幕时实例化一个新的主屏幕活动,或者我自己的解决方案是重写部分应用程序再次,您不需要为了它而使用片段。

编程实践

使用

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

据报道,许多白屏问题来自用碎片轰炸应用程序并弹出到后堆栈,所以要疲倦。

最新更新