[Android] NavigationDrawerとMapFragment併用時の注意

2014.03.26

今回NavigationDrawerとMapFragmentを併用したところ、MapFragmentがやたら主張してきたので、その対処法を記載します。

NavigationDrawerとMapFragmentを併用したときの問題

自分の所持していた端末が android 4.0.3 , 4.0.4(ICS)であったことが幸い(?)し、発覚しました。

どのような問題が発生したのか、紹介します。

まずは、NavigationDrawerを実装し、わかりやすいように画面の下半分にMapFragmentを配置しました。

navimaptest01

このままNavigationDrawerを出すと以下のようになります。 (スクショだとなぜか表示と違う画面(正常画面)が取れてしまうのでカメラで撮影しました。)

navimaptest02

Mapがやたら主張してきて、NavigationDrawerに重なってきました!

調べたところ、今回の現象はICSで再現されるようです。

解決策

いろいろと解決策を調べてみましたが、日本語の情報はほとんどなかったです。 (NavigationDrawerとMapFragmentの組み合わせは、あまりやらない?)

海外サイトにあったいくつかの解決策を参考にしてみて、実際に解決できたのが以下の方法です。

ActionBarDrawerToggle drawerToggle;
drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
            
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                
                super.onDrawerSlide(drawerView, slideOffset);
                
                // drawerViewを前面へ
                mDrawerLayout.bringChildToFront(drawerView);
                mDrawerLayout.requestLayout();
                
                // drawerViewの余白部分の背景を透明にする
                mDrawerLayout.setScrimColor(Color.TRANSPARENT);

            }
        };

ActionBarDrawerToggleのonDrawerSlideをOverrideし、スライドを検知したらNavigationDrawerのViewを強制的に前面にもってくるという感じです。

ちなみに、余白部分の背景を透明にしているのは、先ほどの画像を見てもらうとわかるように、googleロゴや[+ -]部分だけ暗くなってしまうので、それだったら全部明るい方が見栄えがいいからです。

これで実行すると、以下のように正常に表示されます。

navimap03

少し力技感があるので、なにか他にいい方法があれば是非ご連絡いただきたいです。

以上です!