2013年8月23日金曜日

【Android】View.INVISIBLEとView.GONEの違い

さきほどのエントリでView.INVISIBLEとView.GONEについて触れたが,
この2つ,一言で表せば
「VIEWを消す」
で同じなのだが,
厳密には大きく違う.

INVISIBLEに関しては,
触れないし(Clickイベント等が発行されない),見えないけど,確かにそこにいる
オカルティックな存在.

GONEは
アイツはもう消した!
というだからお前は誰なんだよという存在.

分かりづらいかと思うので,サンプルアプリを作ってキャプチャしてみた.

1つめの例
LinearLayoutの中に
RとGとBのTextViewがある状態.
RとBはそれぞれ50dipの幅を持っており,
Gはlayout_weight指定してその残りを占めるようにしている.
ボタンはBの処遇を決めるボタンである.

B:Visible



B:Invisible



B:Gone

これで分かるのが,
Bが消えたときにInvisible/GoneとでGの挙動が違う.
Invisibleの場合は見えなくなったけど配置としてそこにBがあるという判定で
Gは振舞っているが,
Goneの場合は配置からBが消された状態で
GがBのあった場所も占めるようになっている.

これでどう実践的になるかというと,
例えば画面上部にタイトル,進むボタン,戻るボタンがあるようなUIを考える.
さきほどの例と同じようなUIなのだが.
そんななかである条件で進むボタンや戻るボタンを非表示にしたい.
といったときに,Goneを指定してしまうとタイトルがセンターからずれる.
Goneを指定してセンターからずれた状態
タイトルはセンターを死守して欲しい場合はInvisibleを使うべきである.
Invisibleならセンターのままでいてくれる


2つめの例
先程はLinearLayoutだったが,今回はRelativeLayout.
RelativeLayoutでレイアウト依存される側のViewが消えた場合にどうなるか.
今回はGをRelativeLayoutのCenterに配置し,
Gの左にRを,Gの右にBを配置.
ボタンによってGの処遇を決定する.

G:Visible



G:Invisible



G:Gone


Invisibleはレイアウトが崩れなかったが,
GoneにするとGの配置に依存していたBやRが行き場をなくして
親であるRelativeLayoutの左上に配置された.

これは注意すべきである.

こう見ると,InvisibleもGoneも一言でいえば確かに
「Viewを消す」
なのだが,圧倒的に使い方を考えなければいけないことが分かる.


ちなみにこの他に「消す」ことのできるメソッドとして
・setAlpha ※API LV.11~
・setAnimation(AlphaAnimation)
があるが,これらは共に半透過を扱うものであるため,
完全に消しても実物はそこに存在し,
レイアウトに影響を及ぼさず,
触れる(クリックイベント等が発生する)
見えないだけである.


0 件のコメント:

コメントを投稿