i++

プログラム系のメモ書きなど

Android : Toolbar + DrawerLayout で Drawer を一時的に無効にして Navigation Icon (homeAsUpIndicator) を変更する

  • ActionBarDrawerToggle.setDrawerIndicatorEnabled(false) で「ハンバーガーアイコン + Drawer の開閉」を無効にすると、 setToolbarNavigationClickListener で設定したリスナーが呼ばれるようになる
  • Toolbar.setNavigationIcon で Navigation Icon (左上のアイコン)が変更できる
  • 注意ActionBarDrawerToggle.setDrawerIndicatorEnabled(false) の後に Toolbar.setNavigationIcon を呼ぶ必要がある(そうしないとアイコンが表示されませんでした)
    • Toolbar の homeAsUpIndicator を Theme や Style で設定しておくことはできないらしいので、コード上で行う必要があります
  • ジェスチャー(画面端からのスワイプ)によって Drawer が開かれないようにするには DrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSE) を呼ぶ
    • ジェスチャーを再び有効にするには DrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)

ActionBarDrawerToggle.setToolbarNavigationClickListener のリファレンスの文章あたりが参考になります。

When DrawerToggle is constructed with a Toolbar, it sets the click listener on the Navigation icon. If you want to listen for clicks on the Navigation icon when DrawerToggle is disabled (setDrawerIndicatorEnabled(boolean), you should call this method with your listener and DrawerToggle will forward click events to that listener when drawer indicator is disabled.

最近 kotlin を使ってみているのでサンプルは kotlin で(kotlin ははてなシンタックスハイライトできないんですね…。とりあえず言語的に近いと言われている swift でハイライトしてみています)。

一部の変数はメンバー変数に置いているので var や val は抜けています。
Java を使ってどうすればよいかも、だいたいは察しがつくはず…。

初期化部分

AndroidStudio で新規プロジェクトを作成した際に自動生成されるものと基本的に変わりないです。

toolbar = findViewById(R.id.toolbar) as Toolbar
setSupportActionBar(toolbar)

drawer = findViewById(R.id.drawer_layout) as DrawerLayout
toggle = ActionBarDrawerToggle(
        this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer?.setDrawerListener(toggle)
toggle?.syncState()

// ハンバーガーアイコン + Drawer 無効時に Navigation Icon をクリックした際の挙動
// ここでは Drawer を再び有効にしています
toggle?.setToolbarNavigationClickListener {
    toggle?.isDrawerIndicatorEnabled = true
    drawer?.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
}

ハンバーガーアイコンによる Drawer の開閉を無効にする部分

// 順序注意! Enabled を false にした後に Icon を設定する必要があります
toggle?.isDrawerIndicatorEnabled = false
toolbar?.setNavigationIcon(R.drawable.ic_check)
drawer?.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)

参考