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)