如何将一堆视图分组并一起更改它们的可见性

Zho*_*ouX 4 android kotlin

我有一个包含 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() }
}
Run Code Online (Sandbox Code Playgroud)

我确实读过一篇文章,它描述了一种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()
Run Code Online (Sandbox Code Playgroud)

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

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

小智 12

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

<android.support.constraint.Group
    android:id="@+id/profile"
    app:constraint_referenced_ids="profile_name,profile_image" />
Run Code Online (Sandbox Code Playgroud)

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

profile.visibility = GONE
profile.visibility = VISIBLE
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您使用的是 androidx,请改用 androidx.constraintlayout.widget.Group (3认同)

小智 5

您需要创建扩展函数。

例如:

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

fun View.hideGroupViews(vararg view: View) {
    view.forEach {
        it.hide()
    }
}
Run Code Online (Sandbox Code Playgroud)