无法设置约束组的可见性
Posted
技术标签:
【中文标题】无法设置约束组的可见性【英文标题】:Can't set visibility on constraint group 【发布时间】:2018-05-31 14:48:51 【问题描述】:当我尝试在按钮单击时设置组的可见性时,它不会影响视图的可见性。使用 com.android.support.constraint:constraint-layout:1.1.0-beta4。我试过按元素设置它没有问题,但组没有成功。
我的 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)
我的activity_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_
android:layout_
android:visibility="visible"
app:constraint_referenced_ids="textView,textView2" />
</android.support.constraint.ConstraintLayout>
【问题讨论】:
看看this 日志有什么问题 日志中没有错误,只是没有做任何事情 正在用屏幕敲打我的头来解决这个问题。 【参考方案1】:更新:据报道此问题已在 ConstraintLayout 版本 2.0.0 beta 6 中得到修复。请参阅 bug fixes for ConstraintLayout 2.0.0 beta 6 。
这对我来说似乎是一个错误。 GONE
有效,但 INVISIBLE
无效,我认为应该如此。除非有人可以在我的想法错误的地方发布错误报告,否则它可能值得报告。 (我使用的是constraint-layout:1.1.0-beta4
。)
与此同时,这里有一个解决方法,它显式检索组内的 id 并设置每个检索到的视图的可见性。
在 MainActivity.kt 中
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
mLayout
是ConstraintLayout
。
更新:这是另一个解决方法,它利用了以下事实:更改为/从GONE
按预期工作:
private fun toggleLoginUI(show: Boolean)
if (show)
group.visibility = GONE
group.visibility = VISIBLE
else
group.visibility = GONE
group.visibility = INVISIBLE
【讨论】:
可行,但希望有一种不需要遍历元素的方法。感谢您的回答。希望它得到解决。 @SS2095 如果这是一个错误,那么您将不得不等待未来的版本。 (而且我认为这是一个错误。)如果您需要该功能,这是可以在过渡期间完成的最好的。 有人报告过这个错误并有链接吗? @TorstenGrote 也许issuetracker.google.com/issues/117485026?我还看到了对ConstraintLayout
2.0“层”功能的引用,该功能可能以某种方式适用。
我实际上在不久前提出了一个与此相关的问题,因为我同意@Cheticamp 认为这是 Group 类中的一个错误:issuetracker.google.com/issues/130524019【参考方案2】:
您也可以在将组可见性更改为View.INVISIBLE
后简单地调用requestLayout
方法。
fun makeGroupInvisible(group: Group)
group.visibility = View.INVISIBLE
group.requestLayout()
问题是android.support.constraint.Group
在updatePreLayout
方法中更新其成员的可见性,该方法是从onMeasure
在ConstraintLayout
中调用的。
【讨论】:
谢谢,花了 2 天时间才找到'requestLayout()' 求解器 谢谢!这对我有用,但这可以被视为约束布局的错误吗?每次可见性更改后调用 requestLayout() 似乎不太正常 group.requestLayout() 也为我修复了它。那一定是个bug【参考方案3】:android.support.constraint.Group 有一个公共方法
public void updatePreLayout(ConstraintLayout container)
...
更新孩子的可见性,所以调用
dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)
为我工作
【讨论】:
这个答案很简单,可以工作并使用库提供的方法。这应该是正确答案【参考方案4】:遇到了同样的问题,上面没有任何帮助。我的解决方案是在约束集中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)
【讨论】:
【参考方案5】:只需添加跟随线即可更改它。 所以它可见。
group.visibility=ConstraintLayout.GONE
【讨论】:
我不同意这个答案,这个问题是专门关于使用 View.INVISIBLE 的。使用 ConstraintLayout.GONE 与使用 View.GONE 相同。这是一种不同类型的可见性设置。【参考方案6】:只需清理您的项目或重建您的项目
【讨论】:
这没有意义,这应该是修复,但它是。显然,关于 group 的一些东西是错误的,并且可能与 Android Studio 有关。 这对我没有帮助 请分享您的代码,以便我们了解您的问题以上是关于无法设置约束组的可见性的主要内容,如果未能解决你的问题,请参考以下文章