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
相关产品推荐
相关产品推荐

