[Android]android.visibilityにvisible,invisible,goneをデータバインドする方法

Viewのvisibilityのbinding

ViewModelをViewにbindingした際、Viewのvisibilityを変更できるようにすることは多いかと思います。
たいていはvisible/invisibleやvisible/goneの切り替えだけなのでBooleanを処理するBindingAdapterを作成すれば事足ります。

しかし、visible/invisibleに加えてgoneもbindしたい場合があります。

この場合はBoolean?を使用してvisible/invisibleをtrue/falseに、goneをnullにbindする下記のようなBindingAdapterを作成します。

@BindingAdapter("android:bindVisibleInvisibleGone")
fun View.bindVisibleInvisibleGone(visibilityValue: Boolean?) {
    visibility = when (visibilityValue) {
        true -> View.VISIBLE
        false -> View.INVISIBLE
        else -> View.GONE
    }
}

これでViewModelをViewに依存させずに記述できるようになりました。

他にもView.VISIBLEなどがIntであることを利用してIntをbindすればオプショナルにせずともすみそうです。
しかし、意味的にも近くなるのでBoolean?のほうがわかりやすいと思います。

まとめ

ちょっとしたことですが思いつくまで自分は地味に悩みました。

今回検証に使用したソースは下記にアップしています。
muaaru/testBindingAdapter