Overview:
I'm trying to achieve an effect similar to #116, but with the maxOf function. Unfortunately for me, I'm a little bit confused by Contour's behavior when I change the visibility of one of the optional views.
Steps:
We can easily reproduce the behavior that's confusing me using the sample app.
- Add
private val card3 = ExpandableBioCard1(context) to SampleView:
- Add this to
SampleView's init block
card3.layoutBy(
x = matchParentX(marginLeft = 24.dip, marginRight = 24.dip),
y = maxOf(topTo { card2.bottom() + 24.ydip }, topTo { card1.bottom() + 24.ydip })
)
- Add
isVisible = false to ExpandableBioCard2's init block (in my real app this can happen in the render method, but it has the same effect here)
- Notice that there is additional space in between
card3 and card1
(Possibly Misguided) Expectations:
I expected card2's visibility change to GONE to result in card2.bottom() evaluating to 0, causing maxOf to pick the second argument.
I expected this for two reasons:
- The docs for
View.GONE state that the "view is invisible, and it doesn't take any space for layout purposes"
- In a
LinearLayout that contains two views, if you set the visibility of the first view to GONE the second view automatically takes its place
Of course, this is not what's happening. maxOf is always picking topTo { card2.bottom() + 24.ydip } because while card2.height()=0, card2.bottom() is still > card1.bottom().
Current (Possibly Permanent) Workaround:
I can get the desired behavior by doing this:
card3.layoutBy(
x = matchParentX(marginLeft = 24.dip, marginRight = 24.dip),
y = topTo {
when {
card2.isVisible -> card2.bottom() + 24.ydip
else -> card1.bottom() + 24.ydip
}
}
)
Questions:
- Is this working as intended? Why does
card2.bottom() not evaluate to 0?
- Is checking the visibility in
topTo the recommended approach for achieving this effect?
Thank you all for this amazing library! I won't ever write another layout in XML if I can help it 😄 .