我用来LazyVerticalGrid显示项目列表。
LazyVerticalGrid(
cells = GridCells.Fixed(2),
modifier = Modifier.fillMaxSize(),
state = listState,
content = {
Box(modifier = boxModifier) {
ProductItemView(
item = items[index]
)
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
如何调整所有项目的高度?或者我应该使用VerticalGrid() 之外的其他东西?
我使用的是2022年3月16日构建的Android Studio Bumblebee 2021.1.1 Patch 3
androidx.compose.ui:ui-tooling, androidx.compose.ui:ui-tooling-preview, androidx.compose.ui:ui
版本1.2.0-alpha07
我想创建可组合项的预览,但无法创建任何一个。每次我看到错误:“需要编译项目才能显示预览”时,我都会重建、同步项目并重新启动 Android Studio,但这没有帮助。有什么问题吗?
例如我的可组合项:
@Composable
fun DefaultProfileAvatarBox(
modifier: Modifier = Modifier
.size(60.dp),
firstLetter: String
) {
val finalModifier = modifier
.clip(CircleShape)
.background(blueAvatarBackground)
Box(
modifier = finalModifier
) {
Text(
text = firstLetter,
modifier = Modifier
.padding(bottom = 2.dp)
.align(Alignment.Center),
fontSize = 32.sp,
fontWeight = FontWeight.SemiBold,
color = Color.White,
textAlign = TextAlign.Center
)
}
}
@Preview
@Composable
fun DefaultProfileAvatarBoxPreview() {
DefaultProfileAvatarBox(firstLetter = "K")
}
Run Code Online (Sandbox Code Playgroud) android kotlin firebase android-jetpack android-jetpack-compose
我的 ProfileScreen 有 viewModel。
@Composable
fun ProfileScreen() {
val viewModel: ProfileViewModel = viewModel()
...
}
Run Code Online (Sandbox Code Playgroud)
每次我调用 ProfileScreen 时,都会创建新的 viewModel。我如何为我的 ProfileScreen 只创建一个 viewModel 实例。我尝试按照https://insert-koin.io/docs/reference/koin-android/compose/注入 viewModel但当我尝试时
val viewModel: ProfileViewModel = viewModel()
Android Studio 抛出错误。
android dependency-injection kotlin koin android-jetpack-compose
如何减少按钮内的填充?我希望文本更靠近按钮边缘
Button(
onClick = {},
modifier = Modifier.padding(0.dp),
shape = RoundedCornerShape(30.dp),
border = BorderStroke(1.dp, Color(0xFFC4C4C4)),
colors = ButtonDefaults.buttonColors(
contentColor = MaterialTheme.colors.onBackground,
backgroundColor = MaterialTheme.colors.onBackground
)
) {
Text(
text = "lorem ipsu",
fontSize = 13.sp,
textAlign = TextAlign.Center,
modifier = Modifier.padding(start = 1.dp, end = 1.dp)
)
}
Run Code Online (Sandbox Code Playgroud)

当我点击“我已将 MyTheme(){} 添加到主 @Composable 屏幕”时,没有任何连锁反应,MyBox()但它不起作用。是不是少了什么?
@Composable
private MyBox(onClickInvoked: () -> Unit) {
MyAppTheme(isSystemInDarkTheme()) {
Box(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.clip(RoundedCornerShape(10.dp))
.background(MaterialTheme.colors.onBackground)
.clickable(onClick = { onClickInvoked.invoke() })
.padding(horizontal = 10.dp, vertical = 15.dp)
) {
Text(
text = "My text",
modifier = Modifier
.align(Alignment.CenterStart)
.padding(end = 95.dp)
.wrapContentWidth()
.wrapContentHeight(),
color = MaterialTheme.colors.primary
)
Image(
painter = painterResource(R.drawable.icon),
modifier = Modifier
.align(Alignment.CenterEnd)
.padding(end = 20.dp)
.size(60.dp)
)
}
}
}
Run Code Online (Sandbox Code Playgroud) ConstraintLayout(
Modifier
.fillMaxWidth()
.wrapContentHeight()
) {
Image(
painter = rememberImagePainter(it.photoUrl.toString()),
modifier = Modifier
.constrainAs(photo) {
start.linkTo(parent.start, margin = 30.dp)
top.linkTo(parent.top, margin = 30.dp)
}
.width(130.dp)
)
Column(
modifier = Modifier
.constrainAs(holder) {
start.linkTo(photo.end, margin = 30.dp)
top.linkTo(photo.top)
bottom.linkTo(photo.bottom)
end.linkTo(parent.end, margin = 30.dp)
}
.fillMaxWidth()
.wrapContentHeight(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(
modifier = Modifier
.wrapContentWidth()
.wrapContentHeight(),
text = "Lorem Ipsu auto text ator..."
)
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,长文本无法适应布局。如何将文本换行到下一行?我尝试将 wrapContentWidht() 更改为 fillMaxParentWidth 但 id 没有帮助。
我有两个“喜欢”按钮的图标 -ic_thumb_up和ic_thumb_up_selected
图标的类型应取决于offer.likedByUser参数。
var thumbIcon by remember {
mutableStateOf(if (offer.likedByUser) R.drawable.ic_thumb_up_selected else R.drawable.ic_thumb_up)
}
IconButton(
onClick = {
offer.likedByUser = !offer.likedByUser
}
) {
Image(painter = painterResource(id = thumbIcon) )
}
Run Code Online (Sandbox Code Playgroud)
为什么它不起作用?
PersonalDataBox()即使有,我的也没有填满最大可用空间.fillMaxSize()
我的盒子和屏幕底部之间有一个空白区域。我想用 Box() 填满整个屏幕。看起来我的盒子有 .fillWrapHeight()。盒子的父级也是 .fillMaxSize() 并且它工作正常 - 填充最大高度。
@Composable
private fun PersonalDataBox(user: User) {
Box(
modifier = Modifier
.fillMaxSize()
.padding(vertical = 10.dp)
.clip(RoundedCornerShape(topStart = 10.dp, topEnd = 10.dp))
.background(Color.Red)
.padding(horizontal = 25.dp, vertical = 15.dp)
) {
Column(modifier = Modifier.fillMaxSize()) {
Text(
text = stringResource(R.string.personal_data),
modifier = Modifier
.fillMaxWidth()
.padding(top = 10.dp),
fontSize = 16.sp,
fontWeight = FontWeight.SemiBold,
color = MaterialTheme.colors.primary
)
listOf(
Pair(stringResource(R.string.name), user.name),
Pair(stringResource(R.string.surname), user.surname),
Pair(stringResource(R.string.e_mail), user.email),
).forEach {
InputField(it)
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我如何检测用户何时从一个选项卡滑动到第二个选项卡等HorizontalPager()?
val pagerState = rememberPagerState(initialPage = 0)
HorizontalPager(count = TabCategory.values().size, state = pagerState) { index ->
Box(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.onBackground)
) {
when (TabCategory.values()[index]) {
TabCategory.Opinion -> { }
TabCategory.Information -> { }
TabCategory.Videos -> { }
}
}
}
Run Code Online (Sandbox Code Playgroud) android android-layout kotlin android-jetpack android-jetpack-compose
我正在尝试设置ic_remove_selected_photo在盒子的顶端
我所取得的成就:
代码:
Box(modifier = Modifier.size(90.dp).padding(7.dp)) {
Image(
bitmap = bitmap.asImageBitmap(),
modifier = Modifier
.size(80.dp)
.clip(RoundedCornerShape(6.dp)),
contentScale = ContentScale.Crop,
)
IconButton(modifier = Modifier.align(Alignment.TopEnd).size(10.dp)) {
Icon(painter = painterResource(id = R.drawable.ic_remove_selected_photo))
}
}
Run Code Online (Sandbox Code Playgroud)
我如何remove icon在图像上设置?
我想创建一个带有可以左右滚动(从右侧开始)的图表的视图。我已经使用 LazyRow 完成了此操作并将reverseLayout 设置为true。
val scrollState = rememberLazyListState(0)
LazyRow(
reverseLayout = true,
state = scrollState
) {
items(charts) {data ->
ChartBar()
}
}
Run Code Online (Sandbox Code Playgroud)
我的图表是可交换的并且显示正确。
我的问题是我需要始终在屏幕宽度上显示 7 个条形,同时保持水平填充。我不知道如何计算。
第二个问题是检测滑动后新条何时比之前的条更高,然后触发操作。我也不知道该怎么做。
为什么我的应用程序在运行此代码时崩溃:
val scrollState = rememberLazyListState(0)
var isLastItemVisible by remember { mutableStateOf(false) }
LaunchedEffect(scrollState) {
while (!isLastItemVisible) {
val lastVisibleItemIndex = scrollState.layoutInfo.visibleItemsInfo.lastOrNull()?.index
val totalItemsCount = scrollState.layoutInfo.totalItemsCount
isLastItemVisible = lastVisibleItemIndex != null && lastVisibleItemIndex == totalItemsCount - 1
}
onLastItemSeen()
}
Run Code Online (Sandbox Code Playgroud)
当我在循环的最后一行添加任何延迟时,一切都正确。我在 LazyRow 中显示项目。