web-dev-qa-db-ja.com

制約グループに可視性を設定できません

ボタンのクリック時にグループの可視性を設定しようとしても、ビューの可視性には影響しません。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>
26
SS2095

これは私にはバグのように見えます。 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
    }
}

mLayoutConstraintLayoutです。

更新:GONEへの/からの変更が期待どおりに機能するという事実を利用する別の回避策があります。

private fun toggleLoginUI(show: Boolean) {
    if (show) {
        group.visibility = GONE
        group.visibility = VISIBLE
    } else {
        group.visibility = GONE
        group.visibility = INVISIBLE
    }
}
24
Cheticamp

グループの可視性をView.INVISIBLEに変更した後、単にrequestLayoutメソッドを呼び出すこともできます。

fun makeGroupInvisible(group: Group) {
    group.visibility = View.INVISIBLE
    group.requestLayout()
}

問題は、Android.support.constraint.GroupupdatePreLayoutonMeasureから呼び出されるConstraintLayoutメソッドでそのメンバーの可視性を更新することです。

20
lukjar

Android.support.constraint.Groupにはpublicメソッドがあります

 public void updatePreLayout(ConstraintLayout container) {
   ...
 }

それは子供の視界を更新するので

dataGroup.visibility = if (visible) View.VISIBLE else View.INVISIBLE
dataGroup.updatePreLayout(root)

私のために働いた

4
Oliver1123

プロジェクトをクリーンアップするか、プロジェクトをリビルドするだけです

4
Sushant Garg

フォローラインを追加するだけで変更できます。それで目に見える。

group.visibility=ConstraintLayout.GONE
1
Divyesh Kalotra

同じ問題があり、上からの助けは何もありませんでした。私の解決策は、制約セット内の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)
0
zoki