1

我已经为我的 Activity 设置了清单条目,以便它自己处理方向更改。

在我的onConfigurationChanged(),我有这个:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    findViewById(R.id.header).post(new Runnable() {
        @Override
        public void run() {
        }
    });
}

经过几个月没有问题的工作,我刚刚NullPointerExceptionfindViewById()线了。我的结论是View,由于setContentView().

setContentView()这里真的有必要吗?如果是这样,为什么它一直在工作而没有发生任何事故?

4

2 回答 2

2

setContentView不,在那种情况下不需要打电话。代码中的其他内容导致findVieWById返回 null。

于 2011-07-15T22:09:23.860 回答
1

来自Android 活动文档

如果设备的配置(由 Resources.Configuration 类定义)发生更改,则显示用户界面的任何内容都需要更新以匹配该配置。因为 Activity 是与用户交互的主要机制,所以它包括对处理配置更改的特殊支持。

除非您另有说明,否则配置更改(例如屏幕方向、语言、输入设备等的更改)将导致您当前的活动被破坏,并通过 onPause()、onStop() 和onDestroy() 视情况而定。如果活动在前台或对用户可见,则在该实例中调用 onDestroy() 后,将创建该活动的新实例,使用前一个实例从 onSaveInstanceState(Bundle) 生成的 saveInstanceState。

这样做是因为任何应用程序资源(包括布局文件)都可以根据任何配置值进行更改。因此,处理配置更改的唯一安全方法是重新检索所有资源,包括布局、可绘制对象和字符串。因为活动必须已经知道如何保存它们的状态并从该状态重新创建自己,所以这是一种使用新配置重新启动活动的便捷方式。

在某些特殊情况下,您可能希望根据一种或多种类型的配置更改绕过重新启动活动。这是通过清单中的 android:configChanges 属性完成的。对于您说在那里处理的任何类型的配置更改,您将收到对当前活动的 onConfigurationChanged(Configuration) 方法的调用,而不是重新启动。但是,如果配置更改涉及您未处理的任何内容,则活动仍将重新启动并且不会调用 onConfigurationChanged(Configuration)

基本上,您需要确保保存实例状态,并在 onConfigurationChanged() 之后取回信息

希望这可以帮助!

于 2011-07-18T12:25:16.297 回答