8
11

More than 5 years have passed since last update.

Navigation Drawer

Last updated at Posted at 2014-04-05

Navigation Drawer

Developer SiteでNavigation Drawerの学習をしたので覚え書き。オリジナルサイトのコピペ。

Layoutの宣言

DrawerLayoutを宣言して、その中でメインコンテンツとして表示するLayoutとNavigation Drawer内に表示するレイアウトを定義する。

layout.xml
<android.support.v4.widget.DrawerLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- メインコンテンツ -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- Navigation Drawerに表示するレイアウト -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
  • メインコンテンツ(content_frame)は最初の要素として記述し、layout_width, layout_heightともにmatch_parentを指定する。
  • Navigation Drawer(left_drawer)にはandroid:layout_gravity属性を定義し、RTL言語対応のためleftではなくstartを指定する。
  • Navigation Drawerのlayout_widthは320dpを超さないように指定する

Navigation Drawerのイベント取得

上記のlayoutのleft_drawerはListViewで宣言しているのでListView.OnItemClickListenerでクリック・イベントを取得することができる。

また、Navigation Drawerが開いた際と閉じた際のイベントを取得するにはDrawerLayout.DrawerListenerを実装する。ActivityがActionBarを持っている場合はActionBarDrawerToggle(DrawerListenerを実装している)を拡張し、イベントを取得し、ActionBarとNavigation Drawerの連携を実装することができる。

MainActivity.java

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        // ActionBarDrawerToggleを作成
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* 表示しているActivity */
                mDrawerLayout,         /* DrawerLayout */
                R.drawable.ic_drawer,  /* ABのcaretの代わりに表示する画像ID */
                R.string.drawer_open,  /* アクセシビリティ用の文言 */
                R.string.drawer_close  /* アクセシビリティ用の文言 */
                ) {
            // 閉じた時のイベント
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                invalidateOptionsMenu();
            }
            // 開いた時のイベント
            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                invalidateOptionsMenu();
            }
        };

        // ActionBarDrawerToggleをリスナー登録
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        // ABのUpボタン表示
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // onRestoreInstanceState後のトグル状態をシンク
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // トグル状態を保存
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // イベントをActionBarDrawerToggleに通知
        if (mDrawerToggle.onOptionsItemSelected(item)) {
          return true;
        }
        return super.onOptionsItemSelected(item);
    }
8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11