こいつらは一体何
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つの状態全てが表現可能になります。