ナビゲーションバーおよびシステムバーの表示状態を切り替える


Androidには、メールの通知や常駐アプリの起動を知らせてくれるステータスバーが、最初から用意されています。
Android2.xではそのステータスバーの表示/非表示を、アプリ内で設定することができました。
フルスクリーン表示のアプリケーションを作る

そして、Android3.0からは、ユーザーの操作を補助するボタンや、ユーザーへの通知などを行うシステムバーが追加されました。

図1:Android4.0タブレットのシステムバー

そしてAndroid4.0では、新たにNavigation Bar(以降ナビゲーションバー)が追加されました。

図2:Android4.0ナビゲーションバー

ナビゲーションバーは、ハードキーを持たない端末において、画面上にその代わりとなるホームボタンなどを配置します。
Android4.0では、これらの各種バーの表示状態を、アプリ内で切り替えることができます。
今回はその方法について解説していきます。

※ナビゲーションバーは、現状のAVD 4.0エミュレータでは非対応となっており、動作未検証です。実機入手次第検証します。

それでは続きをどうぞ。

表示状態を切り替える各種フラグ

バーの表示状態の切り替えは、新しく追加されたフラグをセットすることで制御します。
各種フラグと、フラグによって切り替えることができる画面の表示はそれぞれ以下の通りです。

FLAG_FULLSCREEN
ステータスバーを消去し、全画面表示を実現します。
API Level 1から存在しているおなじみのフラグです。

SYSTEM_UI_FLAG_LOW_PROFILE
システムバーもしくはナビゲーションバーのある画面を、”Low Profile”モードにします。
”Low Profile”モードになると、ナビゲーションバーやシステムバーに表示されるボタンなどのアイコンが、見えにくい状態になります(図3)。
そうすることによって、本を読んだりゲームをしたりするアプリだった場合に、気が散りにくくなるという利点があります。

“Low Profile”モードは、Android4.0で新たに追加されたモードです。
下図のように、システムバーに表示されるボタンや通知アイコンなどが見えにくい状態となります。
※見えにくいだけで、タッチして操作することは可能です。

図3:Low Profileモード時のAndroid4.0のシステムバー表示

SYSMTE_UI_FLAG_VISIBLE
ステータスバーもしくはナビゲーションバーを見えるようにします。つまり、下図のようなデフォルトの表示状態になります。

図5:SYSTEM_UI_FLAG_VISIBLEセット時(デフォルト表示)

SYSTEM_UI_FLAG_HIDE_NAVIGATION
ナビゲーションバー完全に消去します。FLAG_FULLSCREENと組み合わせることで、Android4.0におけるフルスクリーンを実現することが可能です。ただし、タブレット端末上にて表示されるシステムバーは消すことができませんので注意が必要です。
ユーザー操作を受け付けるとナビゲーションバーは戻ってくるので、ビデオ再生など、閲覧を主としてユーザー操作がそれほど頻繁に起きないようなアプリケーションを作成する際に便利です。

図4:SYSTEM_UI_FLAG_HIDE_NAVIGATIONフラグON時

各種フラグをセットする

各種バーの表示を切り替えるには、setSystemUiVisibilityメソッドをActivity上で使用されるいずれかのViewにに対して以下のように使用します。

mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

mImageは、ImageViewを継承したカスタムViewです。
setSystemUiVisibilityメソッドの引数には前述したフラグがセットされます。

※ただし FLAG_FULLSCREENについてはフラグのセット方法など扱いが異なりますのでこちらを参照してください。
なお、setSystemUiVisibilityメソッド自体はAPI Level 11から存在しています。

表示状態が切り替わる際のイベントを取得する

表示状態が切り替わる際のイベントを取得することで、バーの表示/非表示に合わせて処理を行うことが可能です。
イベントを取得する場合、ソースコード上では以下のようにします。

      //リスナーの登録
      mImage.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener(){
			@Override
			public void onSystemUiVisibilityChange(int visibility) {
				 Toast.makeText(getApplicationContext(), "表示状態が切り替わりました。", Toast.LENGTH_LONG).show();

			}
      });

1行目で setOnSystemUiVisibilityChangeListenerによってリスナーを登録し、 onSystemUiVisibilityChangeメソッドの内部で、イベント発生時の処理を記述しています。
FLAG_FULLSCREENをセットする際にはイベントは発生しません。

図5:Low Profileモードに遷移時にトーストを表示

まとめ

ステータすバーやシステムバーを画面上から消すことで、ゲームや本を読むようなアプリケーションを作成する際には、画面を大きく取れるため非常にアドバンテージが得られます。
しかしそれによって、ユーザーに対する通知やユーザーの操作を妨げてしまうことも事実です。
むやみに非表示にするのではなく、そうすることの必要性をよく考えてみる必要あります。