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

Android平板强制锁定竖屏失效问题求助

解决方案:Android 12+ 平板强制竖屏实现

1. 结合Manifest配置与Activity动态监听(核心兼容方案)

  • 保留Manifest中android:screenOrientation="portrait"配置,同时在Activity中添加方向纠正逻辑:
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 初始锁定竖屏
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        setContentView(R.layout.activity_main)
        
        // API31+ 横屏状态下强制切换回竖屏
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            display?.let {
                val rotation = it.rotation
                if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
                    requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
                    // 延迟锁定避免系统兼容模式干扰
                    Handler(Looper.getMainLooper()).postDelayed({
                        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                    }, 500)
                }
            }
        }
    }
    
    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        // 配置变化后重新锁定竖屏
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }
    }
    
  • 需在Manifest对应Activity标签添加android:configChanges="orientation|screenSize|smallestScreenSize",避免Activity重建并触发onConfigurationChanged。

2. API33+ 直接绕过系统兼容模式

Android 13(API33)及以上新增强制锁定API,可直接忽略系统兼容限制:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    // 强制锁定竖屏,不受系统兼容模式影响
    setRequestedOrientation(
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
        ActivityInfo.SCREEN_ORIENTATION_LOCK_MODE_FORCED
    )
}
  • 该方案是API33+平板的最优解,无需额外监听逻辑。

3. 多Activity应用全局统一处理

创建BaseActivity封装竖屏锁定逻辑,所有需竖屏的Activity继承即可:

abstract class BasePortraitActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lockPortrait()
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        lockPortrait()
    }

    private fun lockPortrait() {
        when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> {
                setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
                    ActivityInfo.SCREEN_ORIENTATION_LOCK_MODE_FORCED
                )
            }
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
                display?.let {
                    val rotation = it.rotation
                    if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
                        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
                        Handler(Looper.getMainLooper()).postDelayed({
                            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                        }, 500)
                    } else {
                        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                    }
                }
            }
            else -> {
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
            }
        }
    }
}

验证要点

  • 横屏启动应用:确认自动切换为竖屏,无黑边横屏显示
  • 竖屏启动后旋转平板:确认无切换横屏按钮,或触发后自动切回竖屏
  • API34平板重点验证强制锁定API的效果

内容的提问来源于stack exchange,提问作者Carl Koh Wei Hao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:26:04