如何在 Jetpack Compose 中强制某些屏幕的方向?

srv*_*rvy 21 android android-jetpack-navigation android-jetpack-compose

有了jetpack compose navigation,我想它可能会成为一个单一的活动应用程序。如何仅对某些可组合项(屏幕)强制定向?假设我只想在播放视频而不是其他屏幕时强制横向?没有导航,可以在清单中声明方向,但使用导航,我们可以在可组合级别指定这一点?

Phi*_*hov 47

您可以从 获取当前活动LocalContext,然后更新requestedOrientation

要在屏幕出现时设置所需的方向并在屏幕消失时将其恢复,请使用DisposableEffect

@Composable
fun LockScreenOrientation(orientation: Int) {
    val context = LocalContext.current
    DisposableEffect(orientation) {
        val activity = context.findActivity() ?: return@DisposableEffect onDispose {}
        val originalOrientation = activity.requestedOrientation
        activity.requestedOrientation = orientation
        onDispose {
            // restore original orientation when view disappears
            activity.requestedOrientation = originalOrientation
        }
    }
}

fun Context.findActivity(): Activity? = when (this) {
    is Activity -> this
    is ContextWrapper -> baseContext.findActivity()
    else -> null
}
Run Code Online (Sandbox Code Playgroud)

用法:

@Composable
fun Screen() {
    LockScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
}
Run Code Online (Sandbox Code Playgroud)