Android中onConfigurationChanged横屏转竖屏时不调用问题求助
问题根源分析
- Activity强制固定方向阻断旋转回调:在
onFullSreen方法中,全屏时固定横屏、非全屏时固定竖屏的代码,会将Activity方向锁死,设备旋转时系统不会触发onConfigurationChanged。 - Fragment旋转逻辑参数错误:设备旋转至横屏时,Fragment调用
onFullSreen(false),导致Activity强制切回竖屏——此时设备处于横屏但Activity被固定为竖屏,后续旋转回竖屏时自然不会触发配置变化。
修复步骤
1. 修改Activity的onFullSreen方法,移除固定方向代码
仅保留UI调整逻辑,保持传感器驱动的方向模式,确保设备旋转能触发回调:
override fun onFullSreen(fullscreen: Boolean) { if (fullscreen) { nav_view.visibility = GONE window.decorView.systemUiVisibility = (android.view.View.SYSTEM_UI_FLAG_IMMERSIVE or android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE or android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) supportActionBar?.hide() Log.d("ORIENTAIONNNNNN", "FULLVIEW") // 保持传感器方向,允许自动旋转 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR } else { nav_view.visibility = VISIBLE Log.d("ORIENTAIONNNNNN", "HALFVIEW") window.decorView.systemUiVisibility = android.view.View.SYSTEM_UI_FLAG_VISIBLE window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) supportActionBar?.show() // 保持传感器方向,允许自动旋转 requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR } }
2. 修正Fragment中onConfigurationChanged的逻辑参数
让旋转方向与全屏/非全屏逻辑匹配,避免反向触发固定方向:
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) Log.d("ORIENTAIONNNNNN", "ORIENTATIONCHANGE") requireActivity().let { if (isChangeScreenButtonClicked) { Log.d("ORIENTAIONNNNNN", "BUTTONCLICKED") stopAutoOrientationFor3Seconds() } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Log.d("ORIENTAIONNNNNN", "LANDSCAPE") // 横屏时触发全屏逻辑 onFullScreenListener.onFullSreen(true) it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR showVideoView(true) isPortraitMode = false } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { Log.d("ORIENTAIONNNNNN", "POTRIAT") // 竖屏时触发非全屏逻辑 onFullScreenListener.onFullSreen(false) it.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR showVideoView(false) isPortraitMode = true } } }
3. 确认Manifest配置
检查Activity的Manifest配置,必须添加configChanges属性,否则系统会销毁重建Activity而非触发onConfigurationChanged:
<activity android:name=".Rove3MainActivity" android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" ...> </activity>
额外优化
- 移除
stopAutoOrientationFor3Seconds中重复设置SCREEN_ORIENTATION_SENSOR的代码,减少冗余逻辑。 - 统一管理方向设置逻辑,避免在多个方法中重复修改
requestedOrientation。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

