【问题标题】:onResume of new Fragment called before onPause in Android Oreo 8.0在 Android Oreo 8.0 中 onPause 之前调用的新 Fragment 的 onResume
【发布时间】:2018-03-21 03:49:27
【问题描述】:

我在使用 android Oreo 时遇到了麻烦。我的 MainActivity 有 4 个片段,当用户按下选项卡时它们会相互替换。现在的问题是,我在 onPause 的单例实例中保存了一个值。每当用户按下下一个选项卡时,会在 onPause 之前调用该片段的 onResume,因此我无法正确地从单例中检索值。

【问题讨论】:

标签: android fragment android-8.0-oreo fragment-lifecycle


【解决方案1】:

请使用 setReorderingAllowed 为 false 以获得正常的片段生命周期。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
fragmentTransaction.setReorderingAllowed(false);
} 

https://developer.android.com/reference/android/app/FragmentTransaction.html#setReorderingAllowed(boolean)

【讨论】:

    【解决方案2】:

    oreo 版本中的 Fragment 存在一些问题。我创建了一个单独的应用程序来检查当我们将一个 Fragment 替换为另一个 Fragment 时调用了哪些生命周期函数。这是日志:

    MainActivity onCreate ->
    FragmentA oncreate ->
    FragmentA oncreateView ->
    MainActivity onStart ->
    FragmentA onStart ->
    MainActivity onResume ->
    FragmentA onResume ->
    Button Pressed;that replace fragment A with Fragment B
    FragmentB onCreate ->
    FragmentB onCreateView ->
    FragmentB onStart ->
    FragmentB onResume ->
    FragmentA onPause ->
    FragmentA onStop ->
    FragmentA onDestroy ->
    

    我正在导入 import android.app.Fragment。当我用 android.support.v4.app.Fragment 替换它时它工作了。

    【讨论】:

      【解决方案3】:

      onResume 应该在 onPause 之前调用。 如果您想在开始片段之前保存某些内容,请在 onStart 中执行。如果您想在离开片段之前保存某些内容,请在 onStop 中执行。 More info on Fragment lifecycle

      【讨论】:

      • 我说的是一个片段被另一个片段替换的情况..在第一个片段 onResume 之后,当我按下另一个选项卡用其他片段替换它时..应该首先调用第一个片段暂停而不是第二个片段 onResume
      • 更新了我的答案。希望它会有所帮助。
      • 我也试过保存在 onStop 中,它在除 oreo 之外的所有 android 版本中都能正常工作
      • 能给我片段实现代码和生命周期logcat吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多