When i try to set the visibility of the group on button click,it doesn't affect the view's visibility.Using com.android.support.constraint:constraint-layout:1.1.0-beta4. I've tried setting it element-wise without problems,but no success with the group.
My 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)
}
}
My 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>
This looks like a bug to me. GONE
works but INVISIBLE
doesn't and I think it should. It may be worth a bug report unless someone can post where my thinking is wrong. (I am using constraint-layout:1.1.0-beta4
.)
In the meantime, here is a work-around that explicitly retrieves the ids within the group and sets the visibility of each retrieved view.
Within 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
is the ConstraintLayout
.
Update: Here is another work-around that takes advantage of the fact that changing to/from GONE
works as expected:
private fun toggleLoginUI(show: Boolean) {
if (show) {
group.visibility = GONE
group.visibility = VISIBLE
} else {
group.visibility = GONE
group.visibility = INVISIBLE
}
}
You can also simply call requestLayout
method after changing Group visibility to View.INVISIBLE
.
fun makeGroupInvisible(group: Group) {
group.visibility = View.INVISIBLE
group.requestLayout()
}
Problem is that android.support.constraint.Group
updates visibility of its members in updatePreLayout
method which is called from onMeasure
in ConstraintLayout
.
android.support.constraint.Group has a public method
public void updatePreLayout(ConstraintLayout container) {
...
}
that updates children visibilities, so calling
dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)
worked for me
Just clean your project or Rebuild your project
just add follow line you can change it . so it visible .
group.visibility=ConstraintLayout.GONE
Had the same problem and nothing from above helps. My solution was to setVisibility(viewId, ConstraintSet.VISIBLE)
inside constraint set and apply that to ConstraintLayout view.
For example:
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)
来源:https://stackoverflow.com/questions/47865436/cant-set-visibility-on-constraint-group