首页 > 解决方案 > 如何将一堆视图分组并一起更改它们的可见性

问题描述

我有一个包含 2 组视图的活动,它们不能位于同一个 LAYOUT 组但属于同一个 LOGIC 组,这意味着它们应该同时显示或隐藏并绑定点击事件。问题是我觉得写这样的东西真的很糟糕:

fun hide() {
    view1.visibility = View.GONE
    view2.visibility = View.GONE
    view3.visibility = View.GONE
    // ...
    view9.visibility = View.GONE
}


fun show() {
    view1.visibility = View.VISIBLE
    view2.visibility = View.VISIBLE
    view3.visibility = View.VISIBLE
    // ...
    view9.visibility = View.VISIBLE

    view1.setOnClickListener{ run() }
    view2.setOnClickListener{ run() }
    view3.setOnClickListener{ run() }
    // ...
    view9.setOnClickListener{ run() }
}

我确实读过一篇文章,其中描述了一种kotlin 技能,通过以某种方式将这些视图分组然后只处理这些组来简化这种混乱,但不幸的是我再也找不到那个帖子了。

帮助将不胜感激!

========= 2019-07-31 更新 =========

我找到了解决方案,但忘了更新这个问题,我正在寻找的“分组”实际上不是 Kotlin 特定的功能,而是简单地使用vararg,我们可以使用 Kotlin 扩展(太棒了)来简化一点:

// assume we have a base activity or fragment, then put below functions in there
fun View.show() {
    visibility = View.VISIBLE
}

fun show(vararg views: View) {
    views.forEach { it.show() }
}

fun View.hide() {
    visibility = View.GONE
}

fun hide(vararg views: View) {
    views.forEach { it.hide() }
}

// then in any activity or fragment
show(v1, v2, v3, v4)
v9.hide()

============= 更新于 2020-03-07 ================

这正是androidx.constraintlayout.widget.Group设计的目的,它可以从任何地方对一堆视图进行逻辑分组,并通过仅更改组的可见性来控制它们的可见性。

标签: androidkotlin

解决方案


ConstraintLayout1.1 开始,您可以使用 Group 而不是LayoutGroup. 您可以简单地将此代码添加到您的 XML 布局中

<android.support.constraint.Group
    android:id="@+id/profile"
    app:constraint_referenced_ids="profile_name,profile_image" />

然后你可以从代码中调用它来实现你需要的行为

profile.visibility = GONE
profile.visibility = VISIBLE

有关更多详细信息,请阅读本文https://medium.com/androiddevelopers/introducing-constraint-layout-1-1-d07fc02406bc


推荐阅读