NavigationView.java revision 0cf8ecaeccbd07b5259927569eaf79e9a275d34f
131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/*
231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Copyright (C) 2015 The Android Open Source Project
331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * you may not use this file except in compliance with the License.
631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * You may obtain a copy of the License at
731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
1031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Unless required by applicable law or agreed to in writing, software
1131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
1231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * See the License for the specific language governing permissions and
1431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * limitations under the License.
1531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */
1631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
1731a49efe2adb59e31611f6871895a3243d835127Yuichi Arakipackage android.support.design.widget;
1831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
1931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.content.Context;
20d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.content.res.ColorStateList;
2131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.content.res.TypedArray;
2201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Bundle;
2301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Parcel;
2401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Parcelable;
25d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.DrawableRes;
2601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.LayoutRes;
2701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.NonNull;
28d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.Nullable;
2931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.R;
3031a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.internal.NavigationMenuPresenter;
3131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.internal.ScrimInsetsFrameLayout;
3231a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v4.view.ViewCompat;
333a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banesimport android.support.v7.internal.view.SupportMenuInflater;
3431a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v7.internal.view.menu.MenuBuilder;
3531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.util.AttributeSet;
3631a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.Menu;
373a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banesimport android.view.MenuInflater;
3831a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.MenuItem;
3931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.View;
4031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
4131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/**
42a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * Represents a standard navigation menu for application. The menu contents can be populated
43a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * by a menu resource file.
44a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * <p>NavigationView is typically placed inside a {@link android.support.v4.widget.DrawerLayout}.
4531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </p>
4631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * <pre>
4731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * &lt;android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
4831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     xmlns:app="http://schemas.android.com/apk/res-auto"
4931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:id="@+id/drawer_layout"
5031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:layout_width="match_parent"
5131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:layout_height="match_parent"
5231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     android:fitsSystemWindows="true"&gt;
5331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
5431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *     &lt;!-- Your contents --&gt;
5531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *
56a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki *     &lt;android.support.design.widget.NavigationView
57a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki *         android:id="@+id/navigation"
5831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *         android:layout_width="wrap_content"
5931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki *         android:layout_height="match_parent"
603a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes *         android:layout_gravity="start"
613a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes *         app:menu="@menu/my_navigation_items" /&gt;
6231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * &lt;/android.support.v4.widget.DrawerLayout&gt;
6331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </pre>
6431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */
65a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Arakipublic class NavigationView extends ScrimInsetsFrameLayout {
6631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
673a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private static final int PRESENTER_NAVIGATION_VIEW_ID = 1;
6801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
693a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private final MenuBuilder mMenu;
703a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private final NavigationMenuPresenter mPresenter;
7101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
723a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private OnNavigationItemSelectedListener mListener;
7331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    private int mMaxWidth;
7431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
753a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private MenuInflater mMenuInflater;
763a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
77a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki    public NavigationView(Context context) {
7831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        this(context, null);
7931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
8031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
81a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki    public NavigationView(Context context, AttributeSet attrs) {
8231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        this(context, attrs, 0);
8331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
8431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
85a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki    public NavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
8631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        super(context, attrs, defStyleAttr);
8731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
883a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        // Create the menu
893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        mMenu = new MenuBuilder(context);
903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
9131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        // Custom attributes
9231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        TypedArray a = context.obtainStyledAttributes(attrs,
93a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                R.styleable.NavigationView, defStyleAttr,
94a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                R.style.Widget_Design_NavigationView);
9531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
9631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        //noinspection deprecation
97a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki        setBackgroundDrawable(a.getDrawable(R.styleable.NavigationView_android_background));
983a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        if (a.hasValue(R.styleable.NavigationView_elevation)) {
993a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            ViewCompat.setElevation(this, a.getDimensionPixelSize(
1003a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes                    R.styleable.NavigationView_elevation, 0));
1013a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
10231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        ViewCompat.setFitsSystemWindows(this,
103a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                a.getBoolean(R.styleable.NavigationView_android_fitsSystemWindows, false));
1043a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
105a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki        mMaxWidth = a.getDimensionPixelSize(R.styleable.NavigationView_android_maxWidth, 0);
1063a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
1073a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        final ColorStateList itemTintList =
108a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                a.getColorStateList(R.styleable.NavigationView_itemTint);
1093a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
1103a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        final int itemBackgroundResource =
111a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki                a.getResourceId(R.styleable.NavigationView_itemBackground, 0);
11231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
1133a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        if (a.hasValue(R.styleable.NavigationView_menu)) {
1143a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            inflateMenu(a.getResourceId(R.styleable.NavigationView_menu, 0));
1153a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
1163a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
11701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.setCallback(new MenuBuilder.Callback() {
11831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            @Override
11931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
12031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                return mListener != null && mListener.onNavigationItemSelected(item);
12131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            }
12231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
12331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            @Override
1243a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            public void onMenuModeChange(MenuBuilder menu) {}
12501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        });
12601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mPresenter = new NavigationMenuPresenter();
1273a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        mPresenter.setId(PRESENTER_NAVIGATION_VIEW_ID);
12801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mPresenter.initForMenu(context, mMenu);
129d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        mPresenter.setItemTintList(itemTintList);
130d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        mPresenter.setItemBackgroundResource(itemBackgroundResource);
13101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.addMenuPresenter(mPresenter);
13201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        addView((View) mPresenter.getMenuView(this));
1333a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
1340cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes        if (a.hasValue(R.styleable.NavigationView_headerLayout)) {
1350cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes            inflateHeaderView(a.getResourceId(R.styleable.NavigationView_headerLayout, 0));
1360cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes        }
1370cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes
1383a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        a.recycle();
13901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
14001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
14101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    @Override
14201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    protected Parcelable onSaveInstanceState() {
14301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        Parcelable superState = super.onSaveInstanceState();
14401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        SavedState state = new SavedState(superState);
14501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        state.menuState = new Bundle();
14601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.savePresenterStates(state.menuState);
14701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        return state;
14801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
14901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
15001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    @Override
15101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    protected void onRestoreInstanceState(Parcelable savedState) {
15201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        SavedState state = (SavedState) savedState;
15301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        super.onRestoreInstanceState(state.getSuperState());
15401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mMenu.restorePresenterStates(state.menuState);
15531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
15631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
15731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    /**
15831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     * Set a listener that will be notified when a menu item is clicked.
15931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     *
16031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     * @param listener The listener to notify
16131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     */
16231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public void setNavigationItemSelectedListener(OnNavigationItemSelectedListener listener) {
16331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        mListener = listener;
16431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
16531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
16631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    @Override
16731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    protected void onMeasure(int widthSpec, int heightSpec) {
16831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        switch (MeasureSpec.getMode(widthSpec)) {
16931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            case MeasureSpec.EXACTLY:
17031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                // Nothing to do
17131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                break;
17231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            case MeasureSpec.AT_MOST:
17331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                widthSpec = MeasureSpec.makeMeasureSpec(
17431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                        Math.min(MeasureSpec.getSize(widthSpec), mMaxWidth), MeasureSpec.EXACTLY);
17531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                break;
17631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki            case MeasureSpec.UNSPECIFIED:
17731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                widthSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY);
17831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki                break;
17931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        }
18031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        // Let super sort out the height
18131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        super.onMeasure(widthSpec, heightSpec);
18231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
18331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
1843a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
1853a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    /**
1863a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * Inflate a menu resource into this navigation view.
1873a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     *
1883a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * <p>Existing items in the menu will not be modified or removed.</p>
1893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     *
1903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * @param resId ID of a menu resource to inflate
1913a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     */
1923a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    public void inflateMenu(int resId) {
1933a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        getMenuInflater().inflate(resId, mMenu);
1943a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    }
1953a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
19631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    /**
1973a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes     * Returns the {@link Menu} instance associated with this navigation view.
19831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     */
19931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public Menu getMenu() {
20031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        return mMenu;
20131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
20231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
20331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    /**
20401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Inflates a View and add it as a header of the navigation menu.
20501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     *
20601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @param res The layout resource ID.
20701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @return a newly inflated View.
20801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
20901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public View inflateHeaderView(@LayoutRes int res) {
21001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        return mPresenter.inflateHeaderView(res);
21101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
21201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
21301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
21401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Adds a View as a header of the navigation menu.
21501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     *
21601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @param view The view to be added as a header of the navigation menu.
21701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
21801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void addHeaderView(@NonNull View view) {
21901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mPresenter.addHeaderView(view);
22001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
22101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
22201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
22301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * Removes a previously-added header view.
22401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     *
22501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * @param view The view to remove
22601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
22701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public void removeHeaderView(@NonNull View view) {
22801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        mPresenter.removeHeaderView(view);
22901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
23001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
23101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
232d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * Return the tint applied to the icon and text of the menu items, if specified.
233d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
234d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @return the tint applied to the icon and text of the menu items
235d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @see #setItemTintList(ColorStateList)
236a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * @attr ref R.styleable#NavigationView_itemTint
237d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
238d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    @Nullable
239d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public ColorStateList getItemTintList() {
240d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        return mPresenter.getItemTintList();
241d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
242d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
243d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
244d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * Applies a tint to the icon and text of the menu items.
245d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
246d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @param itemTintList the tint to apply, may be {@code null} to use default tint.
247a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * @attr ref R.styleable#NavigationView_itemTint
248d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
249d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public void setItemTintList(@Nullable ColorStateList itemTintList) {
250d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        mPresenter.setItemTintList(itemTintList);
251d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
252d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
253d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
254d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * Return the resource ID of background drawable for the menu items.
255d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
256d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @return The resource ID
257d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @see #setItemBackgroundResource(int)
258a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * @attr ref R.styleable#NavigationView_itemBackground
259d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
260d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    @DrawableRes
261d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public int getItemBackgroundResource() {
262d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        return mPresenter.getItemBackgroundResource();
263d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
264d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
265d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
266d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * Set the background of the menu items to a given resource. The resource should refer to
267d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * a Drawable object or 0 to use the background background.
268d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     *
269d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     * @param itemBackground The identifier of the resource.
270a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * @attr ref R.styleable#NavigationView_itemBackground
271d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki     */
272d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    public void setItemBackgroundResource(@DrawableRes int itemBackground) {
273d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki        mPresenter.setItemBackgroundResource(itemBackground);
274d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    }
275d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki
2763a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    private MenuInflater getMenuInflater() {
2773a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        if (mMenuInflater == null) {
2783a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes            mMenuInflater = new SupportMenuInflater(getContext());
2793a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        }
2803a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes        return mMenuInflater;
2813a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes    }
2823a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes
283d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki    /**
284a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * Listener for handling events on navigation items.
28531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki     */
28631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    public interface OnNavigationItemSelectedListener {
28731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
28831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        /**
289a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki         * Called when an item in the navigation menu is selected.
29031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki         *
29131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki         * @param item The selected item
29231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki         */
29331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki        public boolean onNavigationItemSelected(MenuItem item);
29431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki    }
29531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki
29601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    /**
297a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki     * User interface state that is stored by NavigationView for implementing
29801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     * onSaveInstanceState().
29901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki     */
30001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    public static class SavedState extends BaseSavedState {
30101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
30201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public Bundle menuState;
30301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
30401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public SavedState(Parcel in) {
30501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            super(in);
30601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            menuState = in.readBundle();
30701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
30801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
30901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public SavedState(Parcelable superState) {
31001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            super(superState);
31101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
31201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
31301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        @Override
31401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public void writeToParcel(@NonNull Parcel dest, int flags) {
31501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            super.writeToParcel(dest, flags);
31601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            dest.writeBundle(menuState);
31701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        }
31801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
31901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        public static final Parcelable.Creator<SavedState> CREATOR
32001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                = new Parcelable.Creator<SavedState>() {
32101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
32201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            @Override
32301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            public SavedState createFromParcel(Parcel parcel) {
32401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return new SavedState(parcel);
32501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
32601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
32701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            @Override
32801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            public SavedState[] newArray(int size) {
32901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki                return new SavedState[size];
33001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki            }
33101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
33201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki        };
33301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
33401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki    }
33501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki
33631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki}
337