Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Kotlin】Androidアクティビティでナビゲーションバーを恒久的に非表示にする方法

この記事では、Kotlinを使用してAndroidアクティビティ内のナビゲーションバー(システムバー)を恒久的に非表示にする方法を解説します。「没入型(イマーシブ)スティッキーモード」を活用することで、ナビゲーションバーとステータスバーの両方を隠した全画面表示を実現できます。

手順1:新規プロジェクトを作成する

Android Studioを起動し、メニューからFile → New Projectを選択します。必要な項目をすべて入力して、新しいプロジェクトを作成してください。

手順2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:background="#008080"
        android:padding="5dp"
        android:text="TutorialsPoint"
        android:textColor="#fff"
        android:textSize="24sp"
        android:textStyle="bold" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello World!"
        android:textColor="@android:color/holo_blue_dark"
        android:textSize="24sp"
        android:textStyle="bold" />
</RelativeLayout>

手順3:MainActivity.kt を実装する

src/MainActivity.kt に以下のコードを記述します。

import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity

@Suppress("DEPRECATED_IDENTITY_EQUALS", "DEPRECATION")
class MainActivity : AppCompatActivity() {

    private var currentApiVersion: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"
        currentApiVersion = Build.VERSION.SDK_INT

        val flags: Int = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
            View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
            View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
            View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY

        if (currentApiVersion >= Build.VERSION_CODES.KITKAT) {
            window.decorView.systemUiVisibility = flags
            val decorView: View = window.decorView
            decorView.setOnSystemUiVisibilityChangeListener { visibility ->
                if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN === 0) {
                    decorView.systemUiVisibility = flags
                }
            }
        }
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus) {
            window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or
                View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        }
    }
}

コードのポイント

  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY:画面をスワイプしてもシステムバーが一時的に表示されるだけで、自動的に再び非表示になります。通常のイマーシブモードと異なり、フラグがクリアされません。
  • setOnSystemUiVisibilityChangeListener:システムバーの表示状態が変化したことを検知し、即座にフラグを再適用します。
  • onWindowFocusChanged:ダイアログ表示などでフォーカスが戻ったタイミングでも全画面状態を維持するために、フラグを再設定しています。

なお、systemUiVisibilityはAPI 30(Android 11)以降で非推奨となっています。最新の環境では WindowInsetsController(またはAndroidXの WindowCompat.getInsetsController())と BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE を使う方法が推奨されるため、新しいプロジェクトではこちらの利用も検討してください。

手順4:AndroidManifest.xml を編集する

androidManifest.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q11">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行して動作を確認する

それではアプリを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続しているものとします。Android Studioからプロジェクト内のアクティビティファイルを開き、ツールバーのRun(実行)アイコンをクリックしてください。デバイス選択画面で接続したスマートフォンを選択すると、端末側にアプリが起動し、ナビゲーションバーが非表示になった全画面表示が確認できます。

  1. 【Android】アクティビティでナビゲーションバーを完全に非表示にする方法

    本記事では、Androidアプリのアクティビティでナビゲーションバー(画面下部の戻る・ホーム・最近使ったアプリの各ボタンが並ぶ領域)を完全に非表示にする方法を解説します。ゲームや動画再生アプリなど、没入感のある全画面UIを実装したい場合に役立つテクニックです。 手順1:Android Studioで新規プロジェクトを作成 Android Studioを起動し、メニューから「File」→「New Project」を選択して新しいプロジェクトを作成します。必要事項を入力して、プロジェクトのセットアップを完了させましょう。 手順2:レイアウトファイル(activity_main.xml)の作成 re

  2. 【Kotlin入門】AndroidでImageViewのマージンをコードから動的に設定する方法

    このチュートリアルでは、Kotlinを使用してAndroidアプリのImageViewにマージン(外側の余白)をプログラム的に設定する方法を、ステップごとにわかりやすく解説します。レイアウトXMLだけでなく、コードから動的に余白を変更したい場合に役立つテクニックです。ステップ1:新規プロジェクトの作成Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目(プロジェクト名、パッケージ名、保存先など)をすべて入力してください。言語は「Kotlin」を選択します。ステップ2:レイアウトファイルの編集res/layout/ac