ジェスチャーナビゲーションを一時的に無効化する

2022年10月14日

開発環境
OS:Windows 10
SDK:Android Studio Dolphin | 2021.3.1

概要

Android 10から実装されたジェスチャーナビゲーション。

この機能とDrawerLayoutとの相性が悪いので一時的に無効化します。

ジェスチャーナビゲーションを初めて知る

Android 13のサポート対応のため、伊勢125社巡りをデバッグしていたときのこと。

Android 13の仮想デバイスを用意し、マップ画面を確認していた際に違和感が。

マップ画面は、DrawerLayoutで構成しており、画面左右にNagivationViewをセット。

画面左端から右へスワイプ、または、画面右端から左へスワイプするとメニューが表示される作りになっています。

その想定で画面左端から右へスワイプした結果、画面左端に下記のような矢印(<)が表示されました。

そして、次の瞬間、マップ画面が閉じて、ホーム画面が表示されました。

えっ。。。

戸惑います。

もう1度、同じ操作をしてもやはりホーム画面に戻されます。

そこでネットで調べたところ、ジェスチャーナビゲーションが機能していたことが判明しました。

このとき、初めてジェスチャーナビゲーションの存在を知りました。。。

ジェスチャーナビゲーションを無効化する

このジェスチャーナビゲーション。

有効な状態だとマップ画面でスワイプ操作によるメニュー表示ができません。

そこで、マップ画面表示中だけ無効化するようにします。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_maps)


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val layoutMap = findViewById<DrawerLayout>(R.id.layout_map)
        val rect = Rect(0 , 100, 100, 200)
        layoutMap.systemGestureExclusionRects = listOf(rect)
    }

}

ロジックはいたって簡単。

マップ画面のDrawerLayoutでsystemGestureExclusionRectsをコールし、ジェスチャーを無効化するエリアを指定すればいいだけです。

(念のため、Android 10(APIレベル29)以降でのみ動作するようにしています。

そして、再度、デバッグしてみると。

画面左端から右スワイプするとメニューが表示されるようになりました。

ジェスチャーナビゲーション

設定画面の「システム」ー「ジェスチャー」ー「システムナビゲーション」から設定できます。

機能を有効化すると画面端あたりをスワイプすると戻る操作となるようです。