[Android & Kotlin] 全画面表示 WindowInsetsController

アプリによって、ゲームやギャラリーなどは全画面での表示が好まれるケースがあります。ステータスバーやナビゲーションバーが消えてくれると見やすいというような時にどのようにするといいのでしょうか、

 
as413k m43 - [Android & Kotlin]  全画面表示 WindowInsetsController

Android Studio 4.1.3
API 30

 

R904D.E24336V - [Android & Kotlin]  全画面表示 WindowInsetsController

Fullscreen

 
例えばこのような通常の表示で、

  • Status bar
  • Title bar
  • Navigation bar

を非表示にしたい場合
as413k m42 - [Android & Kotlin]  全画面表示 WindowInsetsController

Status bar とNavigation bar については API 30 以降はそれ以前と異なっています。

  • systemUiVisibility: API 29 まで
  • WindowInsetsController: API 30 以降

Title barについてはThemeの変更などで対応できます。
API29まではこちらを参考にしてください、ちなみにAndroid Studio 4.1.3 のフルスクリーンのテンプレートでも古い方法でした(2021年4月)
 

API 30 からは全画面モードに使っていたsystemUiVisibilityが非推奨になりました。代わりに windowInsetsCo...

 

 

Title bar

 
最初にTtile barを非表示にしたいと思います。

NoActionBar のThemeに設定変更します。

Themeの変更は、res/values/themes/ 以下にあります。

as413k m38 - [Android & Kotlin]  全画面表示 WindowInsetsController

デフォルトではこのようになっているparentをNoActionBarに変更

例えばこのようにタイトルバーを非表示にできます。

as413k m41 - [Android & Kotlin]  全画面表示 WindowInsetsController

画像は “centerCrop” を設定しているためにタイトルバーが無くなった分だけ拡大されました。

このケースでの設定です。

theme.xml

activity_main.xml

strings.xml

NoActionBarとなるThemeは他にもあります。

あるいは、ActionBarはAppCompatActivity()によって実現しているので単純に
Activity()にすれば表示されなくなります。 

 

hide & show bars

 
WindowInsetsController を使いますが、WindowInsetsController | Android Developers をみるとAPI Level S で非推奨になるものもあるようで、いつものドタキャンAPIもありそうだなという感じです。
以降の説明も半年後には使えなくなっている事もありえます(あるあるネタ)
 

status bar と navigation bar を非表示にするために
hide(types: Int)
を使います。

両方のbarを非表示にしますが、片方だけでも可能です

表示させる場合は、show(types: Int) を使います

とします。

 

behavior

 
以前の全画面の方法として Immersive Sticky モードがありました。アプリ優先型没入モードというような意味です。
通常は全画面で何か必要な場合のみbarを表示させて、数秒後には元の全画面に戻るモードです

これは半透明なバーですが透明ではないバーを表示させたり
BEHAVIOR_SHOW_BARS_BY_SWIPE

スワイプではなくタッチで表示させる
BEHAVIOR_SHOW_BARS_BY_TOUCH

などがあります。

 

サンプルコード

 
ボタンを使って、バーの非表示から半透明でスワイプで一時表示
非表示から表示させるコードを作ってみます。

MainActivity.kt

レイアウトです
何か画像があるとわかりやすいです

activity_main.xml

リソース
strings.xml

Title barを非表示にするためThemeを変更します。
theme.xml

View Bindingを使えるように追加します
build.gradle

これで実行してみましょう

 

これはAPI30からなのでそれ以前ではsystemUiVisibilityを使わないといけないのでAPIによる切り分けが必要になります。

 
 
Reference:
WindowInsetsController | Android Developers