アプリによってはフルスクリーン、全画面表示が好まれるものがあります。ゲームやギャラリーアプリなどです。ただ全画面にしてしまうと、ナビができなくなりユーザーが困ることに。それについては幾つかのオプションが提示されています。
 
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
API 29
全画面
- systemUiVisibility: API 29 まで
 - WindowInsetsController: API 30 以降
 
コードでのfullscreenにはAPIが19以上という制約がありますが、API19未満のシェアは相当少なくなってきています。そろそろ古い機種の事は考え無くてもいいかな…
例えば、この画像をフルスクリーンで表示したいとすると
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
これを普通に表示させるとこうなります
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
フルスクリーンにするには3種類のバーを非表示にする必要があります。
- ステータスバー
 - タイトルバー
 - ナビゲーションバー
 
それぞれのバーについは以下を参照してください
 
Enable fullscreen mode | Android Developers によると幾つかのアプローチがあると言っていますので、それぞれ試してみます。
観賞モード
Lean backと言われている観賞モードです。ユーザーが画面を頻繁に操作しない例えば動画などでの全画面表示です。
setSystemUiVisibility() から status bar と navigation bar の設定で非表示にできます。
- SYSTEM_UI_FLAG_FULLSCREEN
- status barを非表示
 
 - SYSTEM_UI_FLAG_HIDE_NAVIGATION
- navigation barを非表示
 
 
また、全画面から戻ったり終了させるためには、画面をタップして戻ることが可能です。
 
このシステムバーの表示、非表示はリスナーを使ってステータスを知ることができます。
setOnSystemUiVisibilityChangeListener
 
なお、タイトルバーはここでは外しておくためにMainActivityの継承はAppCompatActivityではなくActivityとしておきます。(AppCompatActivityは全画面表示モードで使います)
 
MainActivity.java
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42  | 
						package your.package.name; //import androidx.appcompat.app.AppCompatActivity; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.util.Log; //public class MainActivity extends AppCompatActivity { public class MainActivity extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         leanBackMode();     }     private void leanBackMode(){         View decorView = getWindow().getDecorView();         decorView.setSystemUiVisibility(                 View.SYSTEM_UI_FLAG_FULLSCREEN                         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION         );         decorView.setOnSystemUiVisibilityChangeListener                 (new View.OnSystemUiVisibilityChangeListener() {                     @Override                     public void onSystemUiVisibilityChange(int visibility) {                         // Note that system bars will only be "visible" if none of the                         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.                         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {                             Log.d("debug","The system bars are visible");                         } else {                             Log.d("debug","The system bars are NOT visible");                         }                     }                 });     } }  | 
					
 
レイアウトです。画像を画面いっぱいにするために centerCrop でLinearLayoutを使っています、がなくても確認できます。
activity_main.xml
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | 
						<?xml version="1.0" encoding="utf-8"?> <LinearLayout     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context=".MainActivity">     <ImageView         android:layout_width="match_parent"         android:layout_height="match_parent"         android:src="@drawable/img"         android:scaleType="centerCrop"         android:contentDescription="@string/app_name" /> </LinearLayout>  | 
					
 
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
起動時はフルスクリーンとなっており、”The system bars are NOT visible”のログが見て取れます。
画面タップで”The system bars are visible”とログが代わり、ステータスバーとナビゲーションバーが現れます。
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
没入モード
ゲームに没頭している(immersive)時に使うモードです。
setSystemUiVisibility()を呼び出して設定します。
- SYSTEM_UI_FLAG_IMMERSIVE
 - SYSTEM_UI_FLAG_FULLSCREEN
 - SYSTEM_UI_FLAG_HIDE_NAVIGATION
 
画面を内側にスワイプすダウンするとフルスクリーンが解除
されます。
MainActivity.java
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40  | 
						import android.app.Activity; import android.os.Bundle; import android.view.View; import android.util.Log; public class MainActivity extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         immersiveMode();     }     private void immersiveMode(){         View decorView = getWindow().getDecorView();         decorView.setSystemUiVisibility(                 View.SYSTEM_UI_FLAG_IMMERSIVE                 | View.SYSTEM_UI_FLAG_FULLSCREEN                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION         );         decorView.setOnSystemUiVisibilityChangeListener                 (new View.OnSystemUiVisibilityChangeListener() {                     @Override                     public void onSystemUiVisibilityChange(int visibility) {                         // Note that system bars will only be "visible" if none of the                         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.                         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {                             Log.d("debug","The system bars are visible");                         } else {                             Log.d("debug","The system bars are NOT visible");                         }                     }                 });     } }  | 
					
アプリ優先型没入モード
immersiveは、ゲームなどで頻繁に画面をスワイプするような場合などでシステムバー(ステータスバーやナビゲーションバー)が出てくると煩わしくなります。これを軽減するためにSYSTEM_UI_FLAG_IMMERSIVE_STICKYを使うことができるSticky immersive modeです。
 
完全にはシステムバーにならない半透明な状態で何もしなければ数秒で元に戻ります。
- SYSTEM_UI_FLAG_IMMERSIVE_STICKY
 - SYSTEM_UI_FLAG_FULLSCREEN
 - SYSTEM_UI_FLAG_HIDE_NAVIGATION
 
MainActivity.java
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63  | 
						import android.app.Activity; import android.os.Bundle; import android.os.Build; import android.view.View; import android.util.Log; public class MainActivity extends Activity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         stickyImmersiveMode();     }     private void leanBackMode(){         View decorView = getWindow().getDecorView();         decorView.setSystemUiVisibility(                 View.SYSTEM_UI_FLAG_FULLSCREEN                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION         );         decorView.setOnSystemUiVisibilityChangeListener                 (new View.OnSystemUiVisibilityChangeListener() {                     @Override                     public void onSystemUiVisibilityChange(int visibility) {                         // Note that system bars will only be "visible" if none of the                         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.                         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {                             Log.d("debug","The system bars are visible");                         } else {                             Log.d("debug","The system bars are NOT visible");                         }                     }                 });     }     private void stickyImmersiveMode(){         View decorView = getWindow().getDecorView();         decorView.setSystemUiVisibility(                 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY                 | View.SYSTEM_UI_FLAG_FULLSCREEN                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION         );         decorView.setOnSystemUiVisibilityChangeListener                 (new View.OnSystemUiVisibilityChangeListener() {                     @Override                     public void onSystemUiVisibilityChange(int visibility) {                         // Note that system bars will only be "visible" if none of the                         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.                         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {                             Log.d("debug","The system bars are visible");                         } else {                             Log.d("debug","The system bars are NOT visible");                         }                     }                 });     } }  | 
					
 
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
全画面モード
ActivityではなくAppCompatActivityを使いたい場合もあります。SYSTEM_UI_FLAG_LAYOUT_STABLE
を使うとタイトルバーを消せるのですが、これだけだと問題があります。
 
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
画面の status bar, navigation bar にスペースができてしまいます。これを解消するには
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
これらはあたかもシステムバーが非表示であるかのようにビューをレイアウトしてくれるというものです。
この場合この3つにより、画像がシステムバーの表示・非表示に関係なく一定のサイズになるようにしてくれるということです。
- SYSTEM_UI_FLAG_IMMERSIVE_STICKY
 - SYSTEM_UI_FLAG_FULLSCREEN
 - SYSTEM_UI_FLAG_HIDE_NAVIGATION
 - SYSTEM_UI_FLAG_LAYOUT_STABLE
 - SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
 - SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
 
また、Dialog や Pop up メニューなどによってこれらが阻害されないように、onWindowFocusChanged(hasFocus: Boolean)を使ってシステムバーの非表示を遅らせることが必要な場合もあります。
これらをまとめると、
MainActivity.java
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48  | 
						import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.util.Log; public class MainActivity extends AppCompatActivity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);     }     @Override     public void onWindowFocusChanged(boolean hasFocus) {         super.onWindowFocusChanged(hasFocus);         if (hasFocus) {             hideSystemUI();         }     }     private void hideSystemUI() {         View decorView = getWindow().getDecorView();         decorView.setSystemUiVisibility(                 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY                 | View.SYSTEM_UI_FLAG_FULLSCREEN                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION                 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE                 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN         );         decorView.setOnSystemUiVisibilityChangeListener                 (new View.OnSystemUiVisibilityChangeListener() {                     @Override                     public void onSystemUiVisibilityChange(int visibility) {                         // Note that system bars will only be "visible" if none of the                         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.                         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {                             Log.d("debug","The system bars are visible");                         } else {                             Log.d("debug","The system bars are NOT visible");                         }                     }                 });     } }  | 
					
 
これでフルスクリーン表示ができました。
 
![[Android] 全画面モードの systemUiVisibility (API29まで) 1x1.trans - [Android] 全画面モードの systemUiVisibility (API29まで)](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
References:
Enable fullscreen mode | Android Developers
Control the system UI visibility | Android Developers