こいつらは一体何
visibility
もisVisible
もAndroidにおいてViewの表示・非表示を制御するプロパティです。
たとえばidがhoge_button
というボタン要素があったとしてこれを表示状態にしたい時、次のように書けます。
binding.hogeButton.visibility = View.VISIBLE
しかし、以下のようにも書けます。
binding.hogeButton.isVisible = true
「え、じゃあどっちのほうがいいの?!」
ってなりませんか。(私はなりました。)
結論
isVisible
を積極的に使おう! です
Booleanなので関係のない値が入ってしまう可能性が低い
たとえばvisibility
を使う場合、値はIntが入ります。
binding.hogeButton.visibility = View.VISIBLE
このView.VISIBLE
の状態が実はIntなのです。
内部実装を覗いてみましょう。
public static final int VISIBLE = 0x00000000;
public static final int INVISIBLE = 0x00000004;
public static final int GONE = 0x00000008;
Int型の値ならなんでも入ってしまうことになります。
一方で、isVisible
に入るのはBooleanの値です。
binding.hogeButton.isVisible = true
Booleanにはtrue
とfalse
しかないので、いろんな値が入るわけではなく、安全性が一定担保されています。
コードをきれいにまとめやすい
たとえば次のようなコードがあったとして
MatchButtonsLayout.visibility = if(it == UpperSwipeTab.Match) View.VISIBLE else View.GONE
SwipeButtonsLayout.visibility = if(it == UpperSwipeTab.Swipe) View.VISIBLE else View.GONE
これをisVisible
を使って書き直すとこうなります。
MatchButtonsLayout.isVisible = it == UpperSwipeTab.Match
SwipeButtonsLayout.isVisible = it == UpperSwipeTab.Swipe
かなり見やすくなりましたね!
注意
ここまで読んだあなたは、isVisible
最強ダネ〜となるかもしれませんが、isVisible
にも若干の注意事項があります。
isVisibleとisInvisible
実はViewの表示・非表示には次のような3つの状態があります。
-
VISIBLE
- 表示させる
-
INVISIBLE
- Viewが見えなくなる
- しかし、そのViewが占めているスペースは保持されてる
- つまり、Viewが透明になる感じ
-
GONE
- Viewが見えなくなる
- Viewがレイアウト内から完全に消える
- つまりそのViewが占めているスペースも消失する
visibility
ではこの3つの状態を全て表現できますが、isVisible
にはtrueかfalseしかないのでVISIBLE
とGONE
までしか状態を表現できません。
実際にisVisible
の内部実装を見てみましょう。
public inline var View.isVisible: Boolean
get() = visibility == View.VISIBLE
set(value) {
visibility = if (value) View.VISIBLE else View.GONE
}
true
ならVISIBLE
でfalse
ならGONE
になることがわかります。
INVISIBLE
は表現できないのかと心配になりますが、そういう時はisInvisible
を使います。
isInvisible
の内部実装を覗いてみましょう。
public inline var View.isInvisible: Boolean
get() = visibility == View.INVISIBLE
set(value) {
visibility = if (value) View.INVISIBLE else View.VISIBLE
}
true
の場合にINVISIBLE
、falseの場合にはVISIBLE
になります。
従って、isVisible
だけでなくisInvisible
も使う と3つの状態全てが表現可能になります。