LazyColumn(
modifier = Modifier.fillMaxSize(),
state = rememberLazyListState()
) {
item(
contentType = "header"
) {
Text(
text = "Header",
modifier = Modifier
.padding(16.dp)
.fillParentMaxWidth()
)
}
items(
count = 100,
contentType = { "item" }
) {
Text(
text = "Item : $it",
modifier = Modifier
.padding(16.dp)
.fillParentMaxWidth()
)
}
}
2022年4月30日土曜日
LazyColumn/LazyRow で content types を使う
2022年4月14日木曜日
WindowInsetsControllerCompat を使って status bar と navigation bar の light mode を切り替える
Material Catalog アプリのコードを読んでいて見つけたんですが、
WindowCompat.getInsetsController() で取得した WindowInsetsControllerCompat の setAppearanceLightStatusBars() と setAppearanceLightNavigationBars() を使うことで、status bar と navigation bar の light mode(light mode だとアイコンがグレーになり、dark だと白になる)をコードから切り替えることができます。
このようにアプリ用の MaterialTheme のところで SideEffect を使って切り替え処理をすると、Theme の xml で頑張らなくて良くなるので便利です。
WindowCompat.getInsetsController() で取得した WindowInsetsControllerCompat の setAppearanceLightStatusBars() と setAppearanceLightNavigationBars() を使うことで、status bar と navigation bar の light mode(light mode だとアイコンがグレーになり、dark だと白になる)をコードから切り替えることができます。
このようにアプリ用の MaterialTheme のところで SideEffect を使って切り替え処理をすると、Theme の xml で頑張らなくて良くなるので便利です。
@Composable
fun MyAppTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit
) {
val view = LocalView.current
val context = LocalContext.current
SideEffect {
val controller = WindowCompat.getInsetsController(context.findActivity().window, view)
controller?.isAppearanceLightStatusBars = !darkTheme
controller?.isAppearanceLightNavigationBars = !darkTheme
}
MaterialTheme(
colors = if (!darkTheme) LightColorPalette else DarkColorPalette,,
typography = Typography,
shapes = Shapes,
content = content
)
}
private tailrec fun Context.findActivity(): Activity =
when (this) {
is Activity -> this
is ContextWrapper -> this.baseContext.findActivity()
else -> throw IllegalArgumentException("Could not find activity!")
}