无法设置约束组的可见性

Posted

技术标签:

【中文标题】无法设置约束组的可见性【英文标题】:Can't set visibility on constraint group 【发布时间】:2018-05-31 14:48:51 【问题描述】:

当我尝试在按钮单击时设置组的可见性时,它不会影响视图的可见性。使用 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_
                android:layout_
                android:visibility="visible"
                app:constraint_referenced_ids="textView,textView2" />
            </android.support.constraint.ConstraintLayout>

【问题讨论】:

看看this 日志有什么问题 日志中没有错误,只是没有做任何事情 正在用屏幕敲打我的头来解决这个问题。 【参考方案1】:

更新:据报道此问题已在 ConstraintLayout 版本 2.0.0 beta 6 中得到修复。请参阅 bug fixes for ConstraintLayout 2.0.0 beta 6 。



这对我来说似乎是一个错误。 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
    

【讨论】:

可行,但希望有一种不需要遍历元素的方法。感谢您的回答。希望它得到解决。 @SS2095 如果这是一个错误,那么您将不得不等待未来的版本。 (而且我认为这是一个错误。)如果您需要该功能,这是可以在过渡期间完成的最好的。 有人报告过这个错误并有链接吗? @TorstenGrote 也许issuetracker.google.com/issues/117485026?我还看到了对ConstraintLayout 2.0“层”功能的引用,该功能可能以某种方式适用。 我实际上在不久前提出了一个与此相关的问题,因为我同意@Cheticamp 认为这是 Group 类中的一个错误:issuetracker.google.com/issues/130524019【参考方案2】:

您也可以在将组可见性更改为View.INVISIBLE 后简单地调用requestLayout 方法。

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

问题是android.support.constraint.GroupupdatePreLayout 方法中更新其成员的可见性,该方法是从onMeasureConstraintLayout 中调用的。

【讨论】:

谢谢,花了 2 天时间才找到'requestLayout()' 求解器 谢谢!这对我有用,但这可以被视为约束布局的错误吗?每次可见性更改后调用 requestLayout() 似乎不太正常 group.requestLayout() 也为我修复了它。那一定是个bug【参考方案3】:

android.support.constraint.Group 有一个公共方法

 public void updatePreLayout(ConstraintLayout container) 
   ...
 

更新孩子的可见性,所以调用

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

为我工作

【讨论】:

这个答案很简单,可以工作并使用库提供的方法。这应该是正确答案【参考方案4】:

遇到了同样的问题,上面没有任何帮助。我的解决方案是在约束集中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)

【讨论】:

【参考方案5】:

只需添加跟随线即可更改它。 所以它可见。

group.visibility=ConstraintLayout.GONE

【讨论】:

我不同意这个答案,这个问题是专门关于使用 View.INVISIBLE 的。使用 ConstraintLayout.GONE 与使用 View.GONE 相同。这是一种不同类型的可见性设置。【参考方案6】:

只需清理您的项目或重建您的项目

【讨论】:

这没有意义,这应该是修复,但它是。显然,关于 group 的一些东西是错误的,并且可能与 Android Studio 有关。 这对我没有帮助 请分享您的代码,以便我们了解您的问题

以上是关于无法设置约束组的可见性的主要内容,如果未能解决你的问题,请参考以下文章

无法以编程方式设置列表视图中按钮的可见性

无法通过 DataTemplates 设置控制的可见性

隐藏 UIButton 而不仅仅是删除可见性

Java并发 chapter3 共享对象

当我将 ImageView 的可见性设置为线性布局消失时,它的一个孩子仍然存在,另一个在 android 中消失了

Laravel / Eloquent 模型属性可见性