小编ade*_*111的帖子

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:LazyColumn 单独对齐每个项目

我想将一列中的每个项目逐一对齐。Column我相信简单地使用align这样的运算符是可能的:

Column {
   Text(text = "First", modifier = Modifier.align(Alignment.Start))
   Text(text = "Second", modifier = Modifier.align(Alignment.End))
   Text(text = "Third", modifier = Modifier.align(Alignment.Start))
}
Run Code Online (Sandbox Code Playgroud)

但是我找不到适当范围内的align运算符LazyColumn。如何做到这一点LazyColumn?我不感兴趣,horizontalAlignment因为它适用于所有项目。

android android-jetpack-compose

9
推荐指数
1
解决办法
3679
查看次数

Jetpack Compose:行中的多行文本,具有重量和换行文本内容

我有一个Row布局,里面有两个可组合项:

  • Text当内容很长时,它应该包裹自己的宽度并占用尽可能多的空间
  • Image每次都必须出现在右侧Text

为了实现这两个目标,我目前正在使用weight(weight = 1f, fill = false)Composable Text。它对于单行内容效果很好。但是,它会产生换行和换行多行文本的问题。为了看得更清楚,我添加了background(Color.Yellow)一些长话。参见参考代码:

Row {
    Text(
        text = "This is the message with quite super-unprecedented words",
        modifier = Modifier
            .background(Color.Yellow)
            .weight(
                weight = 1f,
                fill = false
            )
    )

    Image(
        painter = painterResource(R.drawable.image),
        contentDescription = null
    )
}
Run Code Online (Sandbox Code Playgroud)

结果如下: 屏幕

是否可以删除末尾的填充,Text以便也Image可以紧密贴合Text多行情况?或者有其他想法如何实现这一目标?我已经查看了softWrapforTextrequireSizefor的参数Image,但运气不佳。

android android-jetpack-compose

9
推荐指数
1
解决办法
3367
查看次数

Android 8.0 (API 26+) 中的全屏浮动上下文菜单

我搜索了很多网站,但它们都已过时。如何在 Android 8.0 中创建全屏浮动上下文菜单?

正如您在此处看到的,Google 在其指南中为我们提供了如何操作的说明,但我想它们也已过时。为什么?下面是一个例子:

这就是 API 23 上的样子(来源,他的 github 代码说它是 API 23 = Android 6.0) 在此处输入图片说明

这就是它在 API 26 (Android 8.0) 上的样子:

在此处输入图片说明

这些 API 之间肯定有一些变化,但我无法真正得到答案。

任何解决方案将不胜感激。

android floating

5
推荐指数
1
解决办法
1164
查看次数

Kotlin Flow:当片段变得不可见时取消订阅 SharedFlow

我读过类似的主题,但找不到正确的答案:

在我的Repository班级我感冒了Flow,我想分享给 2 Presenters/ViewModels所以我的选择是使用shareIn运算符。

让我们看一下 Android 文档的示例:

val latestNews: Flow<List<ArticleHeadline>> = flow {
    ...
}.shareIn(
    externalScope,  // e.g. CoroutineScope(Dispatchers.IO)?
    replay = 1,
    started = SharingStarted.WhileSubscribed()
)
Run Code Online (Sandbox Code Playgroud)

什么文档建议externalScope参数:

用于共享流的 CoroutineScope。这个范围应该比任何消费者活得更久,以根据需要保持共享流的活动。

但是,寻找有关如何停止订阅 aFlow的答案,第二个链接中投票最多的答案说:

解决方案不是取消流程,而是取消流程的范围。

对我来说,这些答案在SharedFlow的情况下是矛盾的。不幸的是,即使在调用它之后,我的Presenter/ViewModel仍然会收到最新的数据onCleared

如何防止?这是我如何Flow在我的Presenter/ 中使用它的示例ViewModel …

android kotlin kotlin-coroutines kotlin-flow kotlin-coroutines-flow

5
推荐指数
1
解决办法
1549
查看次数

附近连接 API:Android 12 无法通告和发现状态代码未知的设备(8037、8038、8039)

我正在开发一个使用附近连接 API 和基本 P2P 策略的应用程序。突然间,很奇怪的是,我无法在我的 Pixel 3a 上宣传和发现配备最新 Android 12 和 Play 服务的设备。OnFailureListeners抛出这些异常:

  • 用于发现:8037: unknown status code: 8037
  • 用于广告:8038: unknown status code: 8038

事实上,它们在文档和源代码中找不到。我还检查了谷歌的“剪刀石头布”官方示例,它抛出了相同的错误代码。

当然,我重新安装了应用程序并重新启动并更新了我的手机。编辑:我也恢复了出厂设置,但没有帮助。但当我使用 Android Flash Tool 降级到最新的 Android 11 后,它又开始工作了。此外,使用不同的手机在 Android 11、10 和 9 上一切仍然运行良好。

有什么想法导致这个问题吗?过去两周一直运行良好,今天停止运行。我相信它需要对源代码进行一些深入的调查(Xlythe,如果我可以寻求你的帮助,那就太好了)。

android google-play-services google-nearby google-nearby-connections

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