无法设置约束组的可见性
Can't set visibility on constraint group
当我尝试在单击按钮时设置组的可见性时,它不会影响视图的 visibility.Using 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_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 fixes for ConstraintLayout 2.0.0 beta 6 。
我觉得这像是一个错误。 GONE
有效,但 INVISIBLE
无效,我认为应该有效。除非有人可以 post 我的想法是错误的,否则它可能值得一个错误报告。 (我正在使用 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
.
更新: 这是另一个解决方法,它利用了更改 to/from GONE
按预期工作的事实:
private fun toggleLoginUI(show: Boolean) {
if (show) {
group.visibility = GONE
group.visibility = VISIBLE
} else {
group.visibility = GONE
group.visibility = INVISIBLE
}
}
您也可以在将组可见性更改为 View.INVISIBLE
后简单地调用 requestLayout
方法。
fun makeGroupInvisible(group: Group) {
group.visibility = View.INVISIBLE
group.requestLayout()
}
问题是 android.support.constraint.Group
在 updatePreLayout
方法中更新其成员的可见性,该方法从 ConstraintLayout
中的 onMeasure
调用。
android.support.constraint.Group 有一个 public 方法
public void updatePreLayout(ConstraintLayout container) {
...
}
更新 children 可见性,因此调用
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)
当我尝试在单击按钮时设置组的可见性时,它不会影响视图的 visibility.Using 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_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 fixes for ConstraintLayout 2.0.0 beta 6 。
我觉得这像是一个错误。 GONE
有效,但 INVISIBLE
无效,我认为应该有效。除非有人可以 post 我的想法是错误的,否则它可能值得一个错误报告。 (我正在使用 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
.
更新: 这是另一个解决方法,它利用了更改 to/from GONE
按预期工作的事实:
private fun toggleLoginUI(show: Boolean) {
if (show) {
group.visibility = GONE
group.visibility = VISIBLE
} else {
group.visibility = GONE
group.visibility = INVISIBLE
}
}
您也可以在将组可见性更改为 View.INVISIBLE
后简单地调用 requestLayout
方法。
fun makeGroupInvisible(group: Group) {
group.visibility = View.INVISIBLE
group.requestLayout()
}
问题是 android.support.constraint.Group
在 updatePreLayout
方法中更新其成员的可见性,该方法从 ConstraintLayout
中的 onMeasure
调用。
android.support.constraint.Group 有一个 public 方法
public void updatePreLayout(ConstraintLayout container) {
...
}
更新 children 可见性,因此调用
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)