0

我已将 Compose for my app 从1.0.0-alpha10最新的1.0.0-beta03

我想在系统栏下方边到边地布局我的活动内容。

除其他外,我使用以下代码告诉系统此意图。

window?.run {
    WindowCompat.setDecorFitsSystemWindows(this, false)
}

这在以前的 Compose 版本中运行良好,但似乎beta03(或者可能是之后的早期版本alpha10)开始设置fitsSystemWindowstrue并使上述代码无效。(将它移到下面setContent { }也没有效果)

在布局资源管理器中,我可以看到decorView它的直接子级LinearLayout现在有fitsSystemWindows = true

我有下面的代码作为临时解决方案,它可以实现预期的行为。

// code that used to work on alpha10        
window?.run {
    WindowCompat.setDecorFitsSystemWindows(this, false)
}

setContent {
   MyApp()
}

// temp workaround for beta03
window?.decorView?.fitsSystemWindows = false
window?.decorView?.allViews?.forEach { view ->
    view.fitsSystemWindows = false
}

这感觉就像我正在与 Compose 对抗以获得预期的结果。

告诉 Compose 不要覆盖的“正确”方法是什么fitsSystemWindows

4

1 回答 1

0

我目前使用以下方法实现了边缘到边缘:

首先在您的 res > 主题中删除操作栏;

<style name="Theme.app_android" parent="Theme.MaterialComponents.Light.NoActionBar">

然后在MainActivity中调用我的composable,设置WindowCompat之前如下图

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    setContent {
         App()
       }
    }
 }

然后使用 ProvideWindowInsets 函数记住在 SideEffect 函数中调用的 systemUiController,该函数将系统状态栏设置为透明

@Composable
fun App() {
    AppTheme {
        ProvideWindowInsets {
            val systemUiController = rememberSystemUiController()

            SideEffect {
                systemUiController.setSystemBarsColor(Color.Transparent, 
                darkIcons = false)
            }

            val navController = rememberNavController()
            val coroutineScope = rememberCoroutineScope()
            val navBackStackEntry by 
            navController.currentBackStackEntryAsState()
            val currentRoute = navBackStackEntry?.destination?.route

            Scaffold() { innerPadding ->
                Box(modifier = Modifier.padding(innerPadding)) {
                    NavGraph(navController = navController)
                }
            }
        }
    }
}

如果您从这里克隆 compose 示例https://github.com/android/compose-samples他们会向您展示这种实现方式

于 2021-07-13T11:18:35.677 回答