You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中onConfigurationChanged横屏转竖屏时不调用问题求助

问题根源分析
  1. Activity强制固定方向阻断旋转回调:在onFullSreen方法中,全屏时固定横屏、非全屏时固定竖屏的代码,会将Activity方向锁死,设备旋转时系统不会触发onConfigurationChanged。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:55:26