标签: android-jetpack-compose

Jetpack Compose:嵌套 LazyColumn / LazyRow

我读过类似的主题,但找不到满意的结果:

我的用例是:创建一个评论列表(数百个项目),并可以显示对每个评论的回复(每个项目数百个项目)。

目前不可能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

47
推荐指数
2
解决办法
2万
查看次数

如何在 Jetpack Compose 中获取上下文

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。但我得到了错误我尝试了很多倍数来源但失败了。

android kotlin android-jetpack android-jetpack-compose

46
推荐指数
10
解决办法
1万
查看次数

Android Compose 中基于特定条件的链接修饰符

我想以这样的方式应用修饰符:如果提供了宽度,则应该使用提供的宽度,否则使用可用的最大宽度。

我按以下方式应用修改器,但结果不符合预期。视图宽度变得混乱。在此请求指导。

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)

android kotlin android-jetpack android-jetpack-compose

45
推荐指数
4
解决办法
2万
查看次数

Scaffold 中 PaddingValues 参数的用途是什么

@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

45
推荐指数
1
解决办法
2万
查看次数

Android 撰写时如何使文本垂直居中?

我正在开发我的第一个完全由 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 text vertical-alignment android-jetpack-compose

45
推荐指数
3
解决办法
3万
查看次数

此版本 (1.1.1) 的 Compose 编译器需要 Kotlin 版本 1.6.10,但您似乎使用的是 Kotlin 版本 1.5.31

我正在使用最新的 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 android-studio android-jetpack-compose

45
推荐指数
3
解决办法
5万
查看次数

如何跟踪并解决Android应用程序的BLASTBufferQueue伪造releaseBufferCallback?

我最近开始使用 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 条目?

android logcat kotlin android-jetpack-compose

45
推荐指数
1
解决办法
1万
查看次数

如何使用 Jetpack Compose 通过单击按钮以编程方式打开外部 URL?

如何使用 Jetpack Compose 通过单击按钮以编程方式打开外部 URL?

@Composable
fun MyButton() {
  Button(onClick = {
    //enter code here
  })
}
Run Code Online (Sandbox Code Playgroud)

android onclick kotlin android-jetpack-compose

43
推荐指数
3
解决办法
2万
查看次数

在 Jetpack Compose Navigation 中共享 viewModel

谁能建议如何在 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

43
推荐指数
4
解决办法
3万
查看次数

如何仅在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 android-jetpack android-jetpack-compose

43
推荐指数
2
解决办法
3万
查看次数