24
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

visibilityよりもisVisibleを積極的に使った方がいい理由

Last updated at Posted at 2023-09-19

こいつらは一体何

visibilityisVisibleもAndroidにおいてViewの表示・非表示を制御するプロパティです。

たとえばidがhoge_buttonというボタン要素があったとしてこれを表示状態にしたい時、次のように書けます。

binding.hogeButton.visibility = View.VISIBLE

しかし、以下のようにも書けます。 :eyes:

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にはtruefalseしかないので、いろんな値が入るわけではなく、安全性が一定担保されています。

コードをきれいにまとめやすい

たとえば次のようなコードがあったとして

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しかないのでVISIBLEGONEまでしか状態を表現できません。

実際にisVisibleの内部実装を見てみましょう。

public inline var View.isVisible: Boolean
    get() = visibility == View.VISIBLE
    set(value) {
        visibility = if (value) View.VISIBLE else View.GONE
    }

trueならVISIBLEfalseなら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つの状態全てが表現可能になります。

24
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?