Android屏幕方向切换时报NullPointerException:findViewById返回null如何解决
问题根因
- 你制作了两套布局,存放在
res/layout-land目录下的横屏版activity_main.xml中,没有定义id为roll_button的Button控件,切换横屏时系统加载横屏布局后,findViewById(R.id.roll_button)返回null,你使用了非空断言!!就直接触发空指针崩溃。 - 你之前的
android:configChanges配置加错了位置:该属性需要配置在AndroidManifest.xml对应的<activity>标签下,你写到布局文件的控件和根布局里完全无效,所以之前的配置没有生效。 - 你设置
android:screenOrientation="portrait"没生效大概率也是配置位置错误,或是两套布局的配置冲突导致。
解决方案
- 方案1:补全横屏布局内容
打开res/layout-land/activity_main.xml,补充id为roll_button的Button和id为dice_image的ImageView,保证两个方向的布局中都有Activity代码里需要引用的这两个控件,且id完全一致即可解决问题。 - 方案2:正确配置configChanges禁止Activity重建
如果你不需要切换布局,只是想横竖屏使用同一套布局、不重建Activity,先把你写在布局里的android:configChanges="orientation|screenSize"全部删掉,再在AndroidManifest.xml的MainActivity标签里添加配置:
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden"> <!-- 其他原有配置 --> </activity>
配置正确后切换横竖屏不会触发Activity重建,就不会重新调用onCreate加载布局,也不会出现空指针问题。
- 方案3:强制竖屏(如果不需要横屏的话)
如果你的应用不需要支持横屏,直接在Manifest的Activity标签里加android:screenOrientation="portrait"即可,注意不要加在布局文件里。
优化建议
你可以改用视图绑定(ViewBinding)替代findViewById,可以从编译层面避免空指针和id写错的问题,不需要手动做非空判断,也不会出现这类因为布局控件缺失导致的运行时崩溃。
内容的提问来源于stack exchange,提问作者Jackson Zhu
相关产品推荐
相关产品推荐

