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

Android Compose旋转屏幕时Drawer意外显示的问题求助

问题:Compose Scaffold旋转屏幕后Drawer意外显示的解决方法?

我使用Compose的Scaffold实现了侧边栏(Drawer),并在AndroidManifest.xml中配置了configChanges="orientation|screenSize"属性。当将屏幕从竖屏旋转为横屏时,Drawer内容意外显示在屏幕上,请问如何阻止这种行为(旋转后无需显示Drawer)?

相关代码

MainActivity.kt

package com.myapplication

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.ui.Modifier

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Scaffold(
                drawerContent = {
                    Text(text = "drawer")
                }
            ) {
                Text(
                    text = "body",
                    modifier = Modifier.padding(it)
                )
            }
        }
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:configChanges="orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

解决方法

问题根源在于:设置configChanges后Activity不会重建,但默认的Scaffold未正确处理配置变更场景下的Drawer状态,导致旋转后意外展开。解决核心是手动掌控Drawer的展开状态,具体实现如下:

修改MainActivity.kt,使用rememberDrawerState管理Drawer状态,并强制默认关闭:

package com.myapplication

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.padding
import androidx.compose.material.*
import androidx.compose.ui.Modifier

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            // 创建默认关闭的Drawer状态,确保配置变更后仍保持关闭
            val drawerState = rememberDrawerState(DrawerValue.Closed)
            
            Scaffold(
                drawerContent = {
                    Text(text = "drawer")
                },
                drawerState = drawerState // 将状态绑定到Scaffold
            ) {
                Text(
                    text = "body",
                    modifier = Modifier.padding(it)
                )
            }
        }
    }
}

说明

  • rememberDrawerState(DrawerValue.Closed)会生成一个默认关闭的状态实例,remember保证重组时状态不会丢失,同时强制配置变更后Drawer保持关闭。
  • 若后续需要手动触发Drawer展开(比如按钮点击),可通过协程调用drawerState.open()实现,状态完全由代码控制,不会再出现意外展开的情况。

内容的提问来源于stack exchange,提问作者John-59

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:54:51