ボタンのクリック時にグループの可視性を設定しようとしても、ビューの可視性には影響しません。com.Android.support.constraint:constraint-layout:1.1.0-beta4を使用します。問題なく要素ごとに設定しようとしましたが、グループでは成功しませんでした。
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>
これは私にはバグのように見えます。 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
}
}
グループの可視性をView.INVISIBLE
に変更した後、単にrequestLayout
メソッドを呼び出すこともできます。
fun makeGroupInvisible(group: Group) {
group.visibility = View.INVISIBLE
group.requestLayout()
}
問題は、Android.support.constraint.Group
がupdatePreLayout
のonMeasure
から呼び出されるConstraintLayout
メソッドでそのメンバーの可視性を更新することです。
Android.support.constraint.Groupにはpublicメソッドがあります
public void updatePreLayout(ConstraintLayout container) {
...
}
それは子供の視界を更新するので
dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)
私のために働いた
プロジェクトをクリーンアップするか、プロジェクトをリビルドするだけです
フォローラインを追加するだけで変更できます。それで目に見える。
group.visibility=ConstraintLayout.GONE
同じ問題があり、上からの助けは何もありませんでした。私の解決策は、制約セット内の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)