【问题标题】:Minimizing the app, changing language and resuming calls onCreate() instead of onResume()最小化应用程序、更改语言和恢复调用 onCreate() 而不是 onResume()
【发布时间】:2013-03-05 09:06:39
【问题描述】:

我刚刚注意到我的应用程序中出现了一个奇怪的问题。当我运行我的应用程序时,如果我最小化它,然后去设置并更改语言,然后恢复我的应用程序(注意:这是最小化/恢复,而不是退出/启动),它调用 Activity 的 onCreate() 而不是打电话给onResume()

这会导致很多问题,尤其是在我在视图中使用片段的区域。显示的片段是旧片段,但它们持有的活动引用是null。所以getActivity()在恢复后并没有立即生效,导致很多地方出现NullPointerException

我的应用是为 Android 4.0.4 及更高版本构建的,我在不同的设备和模拟器上注意到了这个问题,所以这不是平台问题。

理想情况下,我想致电onResume()。如果没有,我宁愿让应用程序自行重新启动,并将用户置于主屏幕上,而不必面对应用程序崩溃。

应用程序本身仅支持一种语言:英语(美国)。

以前有人遇到过这个问题吗?如果是,你能设法解决它吗?

编辑:根据 Class Stacker 的回答,看来我需要自己处理配置更改。这应该没问题,除了onCreate() 本身引发了异常。我在onCreate() 中打电话给getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)。当定位发生变化时,这一行会抛出一个RuntimeException,表示必须在setContentView() 之前调用它。

这是否意味着我的 Activity 没有被正确销毁?

【问题讨论】:

  • 关于您的编辑,请确定:您是否在setContentView() 之前致电setRequestFeature()
  • 当然。我所有的活动都继承自 BaseActivity。 setRequestFeature 在我的个人活动的 onCreate() 中调用的基本活动的 onCreate() 中被调用。之后我才在我的活动中调用 setContentView()。
  • 由于我的应用只支持一种语言,我可以通过在我的 Manifest 中设置 configChanges="locale" 来“修复”它,但我想把它作为绝对的最后手段。
  • 嗯...您现在如何处理配置更改中的片段?重新创建它们?
  • 您仍然可以在检测到配置更改时完全避免调用setRequestFeature(),这很容易。问题是,它是否产生了预期的结果。

标签: android android-activity activity-lifecycle


【解决方案1】:

这不是问题,这是设计使然。

如果语言发生变化,那就是配置变化,就像屏幕旋转一样。

这意味着必须重新创建很多东西。因此,这是通过 onCreate() 处理的。

很抱歉这个坏消息,但您必须更正创建对象的位置以及 onCreate 和 onResume 如何互操作。

here

编辑:关于RuntimeException,为了安全起见,请在super.onCreate(savedInstanceState) 之前拨打getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS),正如您在我们的聊天中发现的那样。

【讨论】:

  • 嗯..我明白了。问题是,这不会是一个问题。我的活动将重新创建自己就好了。问题是,生活在同一个活动中的片段似乎没有被破坏,这导致了这个问题。我会尝试重新创建它们,看看会发生什么。
  • @VinaySShenoy 可能需要将一些数据存储在“非配置”对象中,但这取决于您实际显示的内容的性质,是否正在运行异步任务等。
  • 更改语言会导致 Phonegap 应用程序在 Android 上崩溃,据我所知......所以你的公司很好。
  • @stu.salsbury 这个问题实际上是通过我的回答的 edit 部分中提到的方法解决的,所以据我所知没有崩溃了。
  • @Class Stacker -- 谢谢,是的......问题是我在 HTML5 Phonegap Build 环境中,所以你的解决方案比我可以访问的更底层。不过,我会将我的 Phonegap 问题指向您的解决方案。我认为他们应该实施它。
【解决方案2】:

将这些行放在你的 Manifest 文件中,看看它是否有效。

    <activity
        android:name="youractivity"
        android:configChanges="locale|layoutDirection"
        android:label="youractivitylabel" />

【讨论】:

    【解决方案3】:

    在更改语言环境后,我在片段中遇到了同样的空指针异常问题。为了将来参考,我分享了一个对我的案例很有帮助的解决方案。在片段的onCreateView() 中添加这一行:

    this.setRetainInstance(true);
    

    这可以防止调用onDestroy()onCreate()。相反,onDetach()onAttach(Activity) 将被调用。它帮助了我,希望它可以帮助到这个页面的其他人。 见reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多