你是否必须从onConfigurationChanged()调用setContentView()?

时间:2011-07-15 20:25:51

标签: android screen-rotation

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

在我onConfigurationChanged()中,我得到了这个:

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

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

经过数月的工作没有问题,我在NullPointerException行上只有一个findViewById()。我的结论是,由于遗漏了View,尚未创建有问题的setContentView()

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

来自Android Activity Docs

  

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

     

除非您另行指定,否则配置更改(例如更改   在屏幕方向,语言,输入设备等)将导致您的   当前活动将被销毁,正常活动   onPause(),onStop()和onDestroy()的生命周期过程为   适当。如果活动位于前景或可见   用户,一旦onDestroy()在该实例中被调用,然后是新的   无论如何都会创建活动的实例   之前实例生成的savedInstanceState   的onSaveInstanceState(束)。

     

这是因为任何应用程序资源,包括布局文件,   可以根据任何配置值进行更改。因此,唯一安全的方法   处理配置更改是重新检索所有资源,   包括布局,drawable和字符串。因为活动必须   已经知道如何保存自己的状态并重新创建自己   该状态,这是重新启动活动的便捷方式   本身有一个新的配置。

     

在某些特殊情况下,您可能希望绕过重新启动   基于一种或多种配置更改的活动。这是   在其清单中使用android:configChanges属性完成。任何   你会说你在那里处理的配置改变类型   接到你当前活动的电话   onConfigurationChanged(配置)方法而不是   重新启动。如果配置更改涉及任何您不这样做   但是,处理活动仍将重新启动   onConfigurationChanged(配置)将不会被调用

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

希望这有帮助!