我读过类似的主题,但找不到满意的结果:
我的用例是:创建一个评论列表(数百个项目),并可以显示对每个评论的回复(每个项目数百个项目)。
目前不可能LazyColumn在另一个内部进行嵌套LazyColumn,因为 Compose 会抛出异常:
java.lang.IllegalStateException:垂直可滚动组件是用无限最大高度约束测量的,这是不允许的。常见原因之一是嵌套布局,例如 LazyColumn 和 Column(Modifier.verticalScroll())。如果您想在项目列表之前添加标题,请在 LazyColumn 范围内的主 items() 之前添加一个标题作为单独的 item() 。发生这种情况可能还有其他原因:您的 ComposeView 被添加到具有一定权重的 LinearLayout 中、您应用了 Modifier.wrapContentSize(unbounded = true) 或编写了自定义布局。请尝试消除滚动容器上方层次结构中无限约束的来源。
上面的链接(以及我想到的其他链接)提供的解决方案是:
LazyColumn- 我无法使用它,因为每个项目可以有不同的高度(例如:单行注释与多行注释)。Columns (不是惰性)LazyColumn- 性能方面它不如惰性,当使用 Android Studio 的 Profiler 和 500 个元素的列表时,正常Column会在我的应用程序中使用 350MB 的 RAM,而使用惰性 则需要 220-240MB Composables。因此它无法正常回收。FlowColumn伴奏者 - 我没有看到这个和正常之间有任何性能差异,Column所以请参见上面。android kotlin android-recyclerview android-jetpack-compose android-jetpack-compose-list
fun createListItem(itemIndex: Int) {
Padding(left = 8.dp, right = 8.dp, top = 8.dp, bottom = 8.dp) {
FlexRow(crossAxisAlignment = CrossAxisAlignment.Center) {
expanded(1.0f) {
Text("Item $itemIndex")
}
inflexible {
Button(
"Button $itemIndex",
style = ContainedButtonStyle(),
onClick = {
Toast.makeText(
this@MainActivity,
"Item name $itemIndex",
Toast.LENGTH_SHORT
).show()
})
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试以正常方式制作 Toast。但我得到了错误我尝试了很多倍数来源但失败了。
我想以这样的方式应用修饰符:如果提供了宽度,则应该使用提供的宽度,否则使用可用的最大宽度。
我按以下方式应用修改器,但结果不符合预期。视图宽度变得混乱。在此请求指导。
val myModifier = Modifier.padding(
start = 4.dp, end = 4.dp, top = 8.dp, bottom = 8.dp
)
if (viewWidth == null)
myModifier.then(Modifier.fillParentMaxWidth(1f))
else
myModifier.then(Modifier.width(viewWidth))
myModifier.then(
Modifier.height(viewHeight ?: 100.dp)
.clickable(onClick = { listener.onItemClick(item) })
)
Run Code Online (Sandbox Code Playgroud) @Composable
fun LayoutsCodelab() {
Scaffold(
topBar = {
TopAppBar(
title = {
Text(text = "LayoutsCodelab")
}
)
}
) { innerPadding ->
BodyContent(Modifier.padding(innerPadding))
}
}
Run Code Online (Sandbox Code Playgroud)
删除innerPadding不会改变任何东西。
请注意,我是Compose
新手。
如果有任何困惑,请在评论中询问
android android-jetpack-compose android-jetpack-compose-scaffold
我正在开发我的第一个完全由 Compose 设计的应用程序。
我需要使用Text()撰写组件垂直居中文本。在传统的 Android 开发实践中,我是通过对齐属性来实现这一点的。Text()compose 也具有对齐属性,但目前它的容量有限(Alignment.Horizontal()仅允许),尽管我Text()在 web 中进行研究时注意到不同的对齐值。类似的情况Column()- 它也具有对齐属性.wrapContentSize(),并且对此处可以使用的值也有限制,尽管网络上的快速研究表明它CenterVertically也可能会收到。
你是用什么方法来达到这种视觉效果的?完整的代码片段如下
@ExperimentalUnitApi
@Composable
fun TripBookingContent(state: PassengerTripUiState.TripBookUiState) {
Log.d(App.TAG, "[screen] TripBookingContent")
val baselineGrid = dimensionResource(id = R.dimen.baseline_grid)
val mainPadding = dimensionResource(id = R.dimen.main_margin_compact)
var componentSpace = dimensionResource(id = R.dimen.component_space)
Column(
modifier = Modifier
.wrapContentHeight()
.fillMaxWidth()
.padding(
paddingValues = PaddingValues(
horizontal = mainPadding,
vertical = baselineGrid
)
)
) {
TripViewItem(
data = state.trip,
{},
modifier = Modifier.padding(vertical …Run Code Online (Sandbox Code Playgroud) 我正在使用最新的 Android Studio,我可以通过compose_version设置为 来构建和运行我的应用程序1.0.5。但是,我想使用最新的稳定 compose 版本1.1.1。
我尝试简单地更新项目,build.gradle使其包含以下内容,指向所需的 compose 版本和相应的兼容 kotlin 版本。这些值在应用程序的build.gradle.
buildscript {
ext {
compose_version = '1.1.1'
kotlin_version = '1.6.10'
}
Run Code Online (Sandbox Code Playgroud)
在 Android Studio 中,我转到“工具”>“Kotlin”>“配置 Kotlin 插件更新”并下载最新的 Kotlin 插件(抢先体验)。
如果我打开“工具”>“Kotlin”>“Kotlin REPL”,我会看到Welcome to Kotlin version 1.7.0-RC2-release-258 (JRE 11.0.12+0-b1504.28-7817840).
现在,我尝试重建项目。
我收到错误:
This version (1.1.1) of the Compose Compiler requires Kotlin version 1.6.10 but you appear to be using Kotlin version 1.5.31 which is not known to be compatible. Please …
我最近开始使用 Kotlin 和 Jetpack Compose 构建我的第一个应用程序。到目前为止,我还没有在 Logcat 中看到这个错误,由于我缺乏经验,我很困惑!我正在清理代码,将函数提取到其他类文件,清理我制作的可组合项之一的 UI,现在我得到了 BLASTBufferQueue 的常量 Logcat 条目,其中包含以下条目:
14:03:10.687 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
14:03:10.687 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
14:03:10.704 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
14:03:10.704 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
14:03:10.722 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
14:03:10.722 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
14:03:10.738 E [VRI[MainActivity]#0](f:0,a:3) Faking releaseBufferCallback from transactionCompleteCallback
Run Code Online (Sandbox Code Playgroud)
似乎每次重组都会发生这种情况,但我不知道我改变了什么导致它。
这段代码有关系吗?
使用模拟器时这似乎不是问题,目前是可调整大小的 API 33。
但在物理设备(Pixel 7 Pro)上使用时确实会出现。
现在,在物理设备上,自从我上次开发应用程序以来,我确实使用 12 月更新(内部版本号:TQ1A.221205.011)对其进行了更新。更新后是否发生了某些变化导致出现这些 Logcat 条目?
如何使用 Jetpack Compose 通过单击按钮以编程方式打开外部 URL?
@Composable
fun MyButton() {
Button(onClick = {
//enter code here
})
}
Run Code Online (Sandbox Code Playgroud) 谁能建议如何在 Jetpack Compose Navigation 的不同部分中共享 ViewModel?
根据文档,viewModel 通常应该使用活动范围在不同的 compose 函数中共享,但如果在导航内部则不然。
这是我试图修复的代码。看起来我在导航内的两个部分中获得了两个不同的 viewModel:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
NavigationSystem()
}
}
}
@Composable
fun NavigationSystem() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen(navController) }
composable("result") { ResultScreen(navController) }
}
}
@Composable
fun HomeScreen(navController: NavController) {
val viewModel: ConversionViewModel = viewModel()
var temp by remember { mutableStateOf("") }
val fahrenheit = temp.toIntOrNull() ?: 0
Column(
modifier = …Run Code Online (Sandbox Code Playgroud) android-viewmodel android-jetpack-navigation android-jetpack-compose
我想在布局底部添加边框。我知道我可以使用Divider可组合项,但我只想学习如何绘制边框。
目前,我可以为所有边添加边框,但这不是我想要的。
Row(
modifier = Modifier
.border(border = BorderStroke(width = 1.dp, Color.LightGray))
) {
TextField(value = "", onValueChange = {}, modifier = Modifier.weight(1f))
Switch(checked = true, onCheckedChange = {})
Icon(Icons.Filled.Close, "Remove", tint = Color.Gray)
}
Run Code Online (Sandbox Code Playgroud) android ×8
kotlin ×6
android-jetpack-compose-list ×1
android-jetpack-compose-scaffold ×1
logcat ×1
onclick ×1
text ×1