当我尝试在按钮单击时设置组的可见性时,它不会影响视图的可见性。使用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>
答案 0 :(得分:19)
对我来说这看起来像个错误。 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
}
}
答案 1 :(得分:15)
您还可以在将群组展示次数更改为requestLayout
后调用View.INVISIBLE
方法。
fun makeGroupInvisible(group: Group) {
group.visibility = View.INVISIBLE
group.requestLayout()
}
问题是android.support.constraint.Group
更新updatePreLayout
方法中其成员的可见性,该方法是从onMeasure
中的ConstraintLayout
调用的。
答案 2 :(得分:4)
只需清洁您的项目或重建您的项目
答案 3 :(得分:3)
android.support.constraint.Group具有公共方法
public void updatePreLayout(ConstraintLayout container) {
...
}
会更新儿童的可见性,因此致电
dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)
为我工作
答案 4 :(得分:0)
只需添加关注行即可更改。 所以它可见。
group.visibility=ConstraintLayout.GONE
答案 5 :(得分:0)
遇到相同的问题,以上内容无济于事。我的解决方案是在约束集中的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)