- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
免责声明:我知道 Compose 刚刚进入 alpha01,因此我不希望每个功能可用。但是,特定布局案例的布局和处理是恕我直言的一个重要主题应该尽早解决 😉。
当前基于 View ConstraintLayout
提供了一些特定的处理,以防 subview 是标记为GONE
,引用 ConstrainLayout documentation .
我检查了 Compose ConstraintLayout
文档、可用的修饰符等等,但是没有找到任何指向这个方向的东西。我也找不到任何提示INVISIBLE
以及如何/如果 Compose ConstraintLayout
像基于 View ConstraintLayout
一样处理它。
通常,当前基于 View 的布局(例如 LinearLayout)处理 INVISIBLE
和 GONE
类似时尚:
如果 View 处于状态INVISIBLE
,那么 View 是布局的一部分及其大小,只是不是显示。其他view的整体布局没有变化,保持原位。
如果 View 处于状态GONE
,其大小通常被视为 0 并且重新计算布局并改变了,其他观点通常会改变他们的立场。
这里是一个简单的 Compose ConstraintLayout UI,一行只有 4 个按钮,链接起来让它们很好传播。
// if dontShow is 0 then show all buttons, otherwise make the button with this number
// somehow INVISIBLE. This feature is not yet implemented.
@Composable
fun fourButtonsCL(dontShow: Int) {
ConstraintLayout(Modifier.fillMaxSize()) {
val (btn1, btn2, btn3, btn4) = createRefs()
TextButton(onClick = {}, Modifier.constrainAs(btn1) {}.background(teal200)) { Text("Button1") }
TextButton(onClick = {}, Modifier.constrainAs(btn2) {}.background(teal200)) { Text("Button2") }
TextButton(onClick = {}, Modifier.constrainAs(btn3) {}.background(teal200)) { Text("Button3") }
TextButton(onClick = {}, Modifier.constrainAs(btn4) {}.background(teal200)) { Text("Button4") }
createHorizontalChain(btn1, btn2, btn3, btn4)
}
}
@Preview(showBackground = true)
@Composable
fun previewThreeButtons() {
ComposeAppTheme {
fourButtonsCL()
}
}
假设我想让 Button3
不可见,但将其他 3 个按钮保持在它们所在的位置是。因此只是 Button2
和 Button4
之间的一个洞。如何在不创建另一个的情况下实现这一目标可组合或添加额外的逻辑。虽然这个简单案例中的逻辑可能只是一条 View 线代码,更复杂的布局将需要一些更复杂的逻辑。基于 View 的 ConstraintLayout我们只需要修改 subview 。
另一个假设:使 Button3
从布局中完全消失(GONE
)并重新计算布局,其余按钮变得更宽且均匀分布。乍一看这看起来很简单,在这个非常简单的例子中,它可能很容易。然而,在更复杂的布局中,这可能需要对嵌入式可组合项的约束进行一些甚至大量重新布线。
因此问题是:compose 如何处理 Column
和 Row
布局的这些情况(如在基于 View 的 LinearLayout 中)尤其是 ConstraintLayout
?但是有以下限制😉:没有定义许多新的可组合项和/或没有在可组合项中添加复杂的布局逻辑(重新布线例如约束)。
我是不是遗漏了一些修饰符?这在可组合布局中是否有计划或可能?会是什么在 Compose 中解决此类布局情况的首选方法是什么?
最佳答案
根据@CommonsWare 对问题的评论,我可以解决 INVISIBLE
选项,请参阅下面的代码。
目前(在 alpha-01 中)ConstraintLayout 的实现似乎不完整,至少代码中的一些TODO 注释表明了这一点。这个似乎包括对 GONE
功能的尚未支持。我看到了其中一些:
// TODO(popam, b/158069248): add parameter for gone margin
此外,链功能还没有以与在基于 View 的 ConstraintLayout 中。
object FourElementsNoDSL {
const val elementA = "ElementA"
const val elementB = "ElementB"
const val elementC = "ElementC"
const val elementD = "ElementD"
private val noDSLConstraintSet = ConstraintSet {
// Create references with defines ids, here using a string as id. Could be an Int as well,
// actually it's defined as 'Any'
val elemA = createRefFor(elementA)
val elemB = createRefFor(elementB)
val elemC = createRefFor(elementC)
val elemD = createRefFor(elementD)
// Simple chain only. Instead of this simple chain we can use (for example):
// constrain(elemA) {start.linkTo(parent.start) }
// to set a constraint as known in XML
// constrain(elemA) {start.linkTo(parent.start, 16.dp) }
// constrain(elemB) {start.linkTo(elemA.end) }
// constrain(elemC) {start.linkTo(elemB.end) }
// constrain(elemD) {end.linkTo(parent.end) }
createHorizontalChain(elemA, elemB, elemC, elemD)
}
@Composable
fun fourButtonsCLNoDSL(doNotShow: List<String>) {
ConstraintLayout(constraintSet = noDSLConstraintSet, modifier = Modifier.fillMaxSize()) {
// This block contains the children
Text(text = "A",
modifier = Modifier.layoutId(elementA)
.drawOpacity(if (doNotShow.contains(elementA)) 0f else 1f)
.padding(0.dp),
style = TextStyle(fontSize = 20.sp)
)
Text(text = "B",
modifier = Modifier.layoutId(elementB)
.drawOpacity(if (doNotShow.contains(elementB)) 0f else 1f)
.padding(0.dp),
style = TextStyle(fontSize = 20.sp)
)
Text(text = "C",
modifier = Modifier.layoutId(elementC)
.drawOpacity(if (doNotShow.contains(elementC)) 0f else 1f)
.padding(0.dp),
style = TextStyle(fontSize = 20.sp)
)
Text(text = "D",
modifier = Modifier.layoutId(elementD)
.drawOpacity(if (doNotShow.contains(elementD)) 0f else 1f)
.padding(0.dp),
style = TextStyle(fontSize = 20.sp))
}
}
}
@Preview(showBackground = true)
@Composable
fun previewFourFieldsNoDSL() {
val noShow = listOf(FourElementsNoDSL.elementC)
PlaygroundTheme {
FourElementsNoDSL.fourButtonsCLNoDSL(noShow)
}
}
对象 FourElementsNoDSL
定义布局,提供元素 ID 等。这大致相当于包含此类布局的 XML 文件。noDSL 表示此布局不使用 Compose ConstraintLayout 的 Kotlin数字用户线。目前 DSL 不提供设置元素引用的机制(在 layoutId
中使用)具有定义的 ID,如本示例中所做的那样。
关于android - Compose ConstraintLayout 是否为 INVISIBLE 和 GONE 提供与基于 View 的 ConstraintLayout 相同的处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63638725/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!