Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to group a bunch of views and change their visibility together

Tags:

android

kotlin

I have an activity which contains 2 group of views, which CAN'T be located into same LAYOUT group but belong to same LOGIC group, meaning that they should be shown or hidden and bind click event at same time. The thing is that I feel really awful to write something like this:

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() }
}

I did read a post which describes a kotlin skill to simplify this mess by somehow grouping those views then just handle the groups, but unfortunately I can no longer find that post..

Help would be appreciated!

========= Update 2019-07-31 =========

I found the solution but forgot to update this question, the 'grouping' I was looking for, is in fact not a Kotlin specific feature but simply using vararg, and we can use Kotlin extension (which is AWESOME) to simplify a bit more:

// 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()

============= updated 2020-03-07 ================

This is exactly androidx.constraintlayout.widget.Group designed to do, which can logically group a bunch of views from anywhere and control their visibility by only changing group's visibility.

like image 934
ZhouX Avatar asked Nov 29 '22 21:11

ZhouX


1 Answers

Since ConstraintLayout 1.1 you can use Group instead of LayoutGroup. You can simply add this code to you XML layout

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

And then you can call it from code to achieve behavior, that you need

profile.visibility = GONE
profile.visibility = VISIBLE

For more details read this article https://medium.com/androiddevelopers/introducing-constraint-layout-1-1-d07fc02406bc

like image 109
karenkov_id Avatar answered Dec 03 '22 23:12

karenkov_id