我已经为我的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()
吗?如果是这样的话,为什么它一直在工作而没有发生事故?
答案 0 :(得分:2)
不,在那种情况下不需要调用setContentView
。代码中的其他内容导致findVieWById
返回null。
答案 1 :(得分:1)
如果设备的配置(由...定义) Resources.Configuration类)更改,然后显示任何内容 用户界面需要更新才能匹配该配置。 因为Activity是与之交互的主要机制 用户,它包括处理配置更改的特殊支持。
除非您另行指定,否则配置更改(例如更改 在屏幕方向,语言,输入设备等)将导致您的 当前活动将被销毁,正常活动 onPause(),onStop()和onDestroy()的生命周期过程为 适当。如果活动位于前景或可见 用户,一旦onDestroy()在该实例中被调用,然后是新的 无论如何都会创建活动的实例 之前实例生成的savedInstanceState 的onSaveInstanceState(束)。
这是因为任何应用程序资源,包括布局文件, 可以根据任何配置值进行更改。因此,唯一安全的方法 处理配置更改是重新检索所有资源, 包括布局,drawable和字符串。因为活动必须 已经知道如何保存自己的状态并重新创建自己 该状态,这是重新启动活动的便捷方式 本身有一个新的配置。
在某些特殊情况下,您可能希望绕过重新启动 基于一种或多种配置更改的活动。这是 在其清单中使用android:configChanges属性完成。任何 你会说你在那里处理的配置改变类型 接到你当前活动的电话 onConfigurationChanged(配置)方法而不是 重新启动。如果配置更改涉及任何您不这样做 但是,处理活动仍将重新启动 onConfigurationChanged(配置)将不会被调用
基本上,您需要确保保存实例状态,并在onConfigurationChanged()之后获取信息
希望这有帮助!