Android Can';t在约束组上设置可见性
当我尝试在单击按钮时设置组的可见性时,它不会影响视图的可见性。使用com.android.support.constraint:constraint layout:1.1.0-beta4。我试着将其设置为元素,没有问题,但在团队中没有成功 我的主要活动.ktAndroid Can';t在约束组上设置可见性,android,kotlin,android-constraintlayout,kotlin-android-extensions,Android,Kotlin,Android Constraintlayout,Kotlin Android Extensions,当我尝试在单击按钮时设置组的可见性时,它不会影响视图的可见性。使用com.android.support.constraint:constraint layout:1.1.0-beta4。我试着将其设置为元素,没有问题,但在团队中没有成功 我的主要活动.kt private fun toggleLoginUI(show: Boolean) { if (show) { group.visibility = VISIBLE } else { group
private fun toggleLoginUI(show: Boolean) {
if (show) {
group.visibility = VISIBLE
} else {
group.visibility = INVISIBLE
}
}
fun onClick(view: View) {
when (view.id) {
R.id.button -> toggleLoginUI(true)
R.id.button4 -> toggleLoginUI(false)
}
}
private fun toggleLoginUI(show: Boolean) {
if (show) {
setGroupVisibility(mLayout, group, Group.VISIBLE)
} else {
setGroupVisibility(mLayout, group, Group.INVISIBLE)
}
}
private fun setGroupVisibility(layout: ConstraintLayout, group: Group, visibility: Int) {
val refIds = group.referencedIds
for (id in refIds) {
layout.findViewById<View>(id).visibility = visibility
}
}
我的活动\u main.xml
<android.support.constraint.ConstraintLayout..
<TextView
android:id="@+id/textView"
... />
<TextView
android:id="@+id/textView2"
... />
<Button
android:id="@+id/button"
.../>
<Button
android:id="@+id/button4"
... />
<android.support.constraint.Group
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
app:constraint_referenced_ids="textView,textView2" />
</android.support.constraint.ConstraintLayout>
只需添加以下行即可更改。
所以它是可见的
group.visibility=ConstraintLayout.GONE
更新:这在ConstraintLayout 2.0.0 beta 6版中报告为已修复。看
对我来说这看起来像个虫子<“代码>消失了”
有效,但“不可见”无效,我认为应该这样做。它可能值得一个bug报告,除非有人能发布我的想法是错误的。(我使用的是约束布局:1.1.0-beta4
)
同时,这里有一个解决方法,它显式地检索组内的ID,并设置每个检索到的视图的可见性
在MainActivity.kt内
private fun toggleLoginUI(show: Boolean) {
if (show) {
group.visibility = VISIBLE
} else {
group.visibility = INVISIBLE
}
}
fun onClick(view: View) {
when (view.id) {
R.id.button -> toggleLoginUI(true)
R.id.button4 -> toggleLoginUI(false)
}
}
private fun toggleLoginUI(show: Boolean) {
if (show) {
setGroupVisibility(mLayout, group, Group.VISIBLE)
} else {
setGroupVisibility(mLayout, group, Group.INVISIBLE)
}
}
private fun setGroupVisibility(layout: ConstraintLayout, group: Group, visibility: Int) {
val refIds = group.referencedIds
for (id in refIds) {
layout.findViewById<View>(id).visibility = visibility
}
}
在将组可见性更改为
View.INVISIBLE
后,您也可以简单地调用requestLayout
方法
fun makeGroupInvisible(group: Group) {
group.visibility = View.INVISIBLE
group.requestLayout()
}
问题是,
android.support.constraint.Group
在updatePreLayout
方法中更新其成员的可见性,该方法是从onMeasure
在ConstraintLayoutandroid.support.constraint.Group中调用的
public void updatePreLayout(ConstraintLayout container) {
...
}
这会更新孩子的可视性,所以呼叫
dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)
为我工作只是清理你的项目或重建你的项目有同样的问题,上面没有任何帮助。我的解决方案是setVisibility(viewId,ConstraintSet.VISIBLE)
在约束集中,并将其应用于ConstraintLayout视图
例如:
myContstraintSet.apply {
setVisibility(firstGroup.id, ConstraintSet.VISIBLE)
setVisibility(secondGroup.id, ConstraintSet.GONE)
connect(oneView.id, ConstraintSet.BOTTOM, R.id.secondView, ConstraintSet.TOP)
clear(anotherView.id, ConstraintSet.TOP)
}
myContstraintSet.applyTo(myConstraintLayout)
看看问题出在哪里给日志日志中没有错误。它只是不起任何作用用屏幕敲我的头来解决这个问题。这是可行的,但希望找到一种不需要在元素之间循环的方法。谢谢你的回答。希望它得到解决。@SS2095如果它是一个错误,那么你将不得不等待未来释放。(我认为这是一个bug。)如果您需要该功能,这是过渡期间可以做的最好的事情。是否有人报告了该bug并与之有链接?@TorstenGrote?我还看到了对ConstraintLayout
2.0“Layer”功能的引用,该功能可能在某种程度上是适用的。我实际上在不久前提出了一个与此相关的问题,因为我同意@Cheticamp,这是Group类中的一个bug:我不同意这个答案,这个问题是关于使用View.INVISIBLE的。使用ConstraintLayout.GONE与使用View.GONE相同。这是一种不同类型的可见性设置,它可以工作。这没有意义,这应该是修复,但它是。很明显,关于这个组的某些内容有问题,可能与Android Studio有关。这对我没有帮助。请分享您的代码,以便我们了解您的问题。Thx,花了2天时间找到“requestLayout()”解算器谢谢!这对我来说很有效,但这能被认为是约束布局的一个缺陷吗?在每次可见性更改后调用requestLayout()似乎不太正常。requestLayout()也为我解决了这个问题。这一定是一个错误。这个答案很简单,有效,并且使用了库提供的方法。这应该是正确的答案