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 * <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"> 5331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * 5431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * <!-- Your contents --> 5531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * 56a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * <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" /> 6231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </android.support.v4.widget.DrawerLayout> 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