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; 2230d42dc19655e637644adc3846025027240bf0afYuichi Arakiimport android.graphics.Rect; 23a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.graphics.drawable.Drawable; 2401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Bundle; 2501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Parcel; 2601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.os.Parcelable; 27d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.DrawableRes; 28f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Arakiimport android.support.annotation.IdRes; 2901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.LayoutRes; 3001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Arakiimport android.support.annotation.NonNull; 31d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Arakiimport android.support.annotation.Nullable; 32153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banesimport android.support.annotation.StyleRes; 3331a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.R; 346c72ea0134a3309ff8197f0862aad8d7bc712b55Yuichi Arakiimport android.support.design.internal.NavigationMenu; 3531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.internal.NavigationMenuPresenter; 3631a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.design.internal.ScrimInsetsFrameLayout; 37a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.support.v4.content.ContextCompat; 3862ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banesimport android.support.v4.os.ParcelableCompat; 3962ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banesimport android.support.v4.os.ParcelableCompatCreatorCallbacks; 4005f5ba020fa6caa658c75b6d77436aa980ca0fccChris Banesimport android.support.v4.view.AbsSavedState; 4131a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.support.v4.view.ViewCompat; 4266698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.SupportMenuInflater; 4366698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuBuilder; 4466698bb15ba0f873aa1c2290cc50d6bb839a474aChris Banesimport android.support.v7.view.menu.MenuItemImpl; 4531a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.util.AttributeSet; 46a63940ca14cd3ad9620e94f709930bb968525c57Chris Banesimport android.util.TypedValue; 4731a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.Menu; 483a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banesimport android.view.MenuInflater; 4931a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.MenuItem; 5031a49efe2adb59e31611f6871895a3243d835127Yuichi Arakiimport android.view.View; 5131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 5231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki/** 53a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * Represents a standard navigation menu for application. The menu contents can be populated 54a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * by a menu resource file. 55a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * <p>NavigationView is typically placed inside a {@link android.support.v4.widget.DrawerLayout}. 5631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </p> 5731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * <pre> 5831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 5931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * xmlns:app="http://schemas.android.com/apk/res-auto" 6031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * android:id="@+id/drawer_layout" 6131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * android:layout_width="match_parent" 6231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * android:layout_height="match_parent" 6331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * android:fitsSystemWindows="true"> 6431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * 6531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * <!-- Your contents --> 6631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * 67a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * <android.support.design.widget.NavigationView 68a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * android:id="@+id/navigation" 6931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * android:layout_width="wrap_content" 7031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * android:layout_height="match_parent" 713a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * android:layout_gravity="start" 723a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * app:menu="@menu/my_navigation_items" /> 7331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </android.support.v4.widget.DrawerLayout> 7431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * </pre> 7531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */ 76a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Arakipublic class NavigationView extends ScrimInsetsFrameLayout { 7731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 78a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; 79a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes private static final int[] DISABLED_STATE_SET = {-android.R.attr.state_enabled}; 80a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 813a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private static final int PRESENTER_NAVIGATION_VIEW_ID = 1; 8201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 836c72ea0134a3309ff8197f0862aad8d7bc712b55Yuichi Araki private final NavigationMenu mMenu; 849d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki private final NavigationMenuPresenter mPresenter = new NavigationMenuPresenter(); 8501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 863a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private OnNavigationItemSelectedListener mListener; 8731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki private int mMaxWidth; 8831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 893a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private MenuInflater mMenuInflater; 903a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 91a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki public NavigationView(Context context) { 9231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki this(context, null); 9331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 9431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 95a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki public NavigationView(Context context, AttributeSet attrs) { 9631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki this(context, attrs, 0); 9731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 9831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 99a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki public NavigationView(Context context, AttributeSet attrs, int defStyleAttr) { 10031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki super(context, attrs, defStyleAttr); 10131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 102809bb62055ad42b88f3a69308be222801b89fbd9Chris Banes ThemeUtils.checkAppCompatTheme(context); 103809bb62055ad42b88f3a69308be222801b89fbd9Chris Banes 1043a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes // Create the menu 1056c72ea0134a3309ff8197f0862aad8d7bc712b55Yuichi Araki mMenu = new NavigationMenu(context); 1063a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 10731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki // Custom attributes 10831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki TypedArray a = context.obtainStyledAttributes(attrs, 109a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki R.styleable.NavigationView, defStyleAttr, 110a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki R.style.Widget_Design_NavigationView); 11131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 11231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki //noinspection deprecation 113a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki setBackgroundDrawable(a.getDrawable(R.styleable.NavigationView_android_background)); 1143a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (a.hasValue(R.styleable.NavigationView_elevation)) { 1153a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes ViewCompat.setElevation(this, a.getDimensionPixelSize( 1163a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes R.styleable.NavigationView_elevation, 0)); 1173a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 11831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki ViewCompat.setFitsSystemWindows(this, 119a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki a.getBoolean(R.styleable.NavigationView_android_fitsSystemWindows, false)); 1203a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 121a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki mMaxWidth = a.getDimensionPixelSize(R.styleable.NavigationView_android_maxWidth, 0); 1223a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 123a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes final ColorStateList itemIconTint; 124a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes if (a.hasValue(R.styleable.NavigationView_itemIconTint)) { 125a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes itemIconTint = a.getColorStateList(R.styleable.NavigationView_itemIconTint); 126a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } else { 127a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes itemIconTint = createDefaultColorStateList(android.R.attr.textColorSecondary); 128a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 1293a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 130153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes boolean textAppearanceSet = false; 131153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes int textAppearance = 0; 132153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes if (a.hasValue(R.styleable.NavigationView_itemTextAppearance)) { 133153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes textAppearance = a.getResourceId(R.styleable.NavigationView_itemTextAppearance, 0); 134153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes textAppearanceSet = true; 135153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes } 136153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes 137153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes ColorStateList itemTextColor = null; 138a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes if (a.hasValue(R.styleable.NavigationView_itemTextColor)) { 139a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes itemTextColor = a.getColorStateList(R.styleable.NavigationView_itemTextColor); 140153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes } 141153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes 142153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes if (!textAppearanceSet && itemTextColor == null) { 143153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes // If there isn't a text appearance set, we'll use a default text color 144a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes itemTextColor = createDefaultColorStateList(android.R.attr.textColorPrimary); 145a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 146a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 147a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes final Drawable itemBackground = a.getDrawable(R.styleable.NavigationView_itemBackground); 14831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 14901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenu.setCallback(new MenuBuilder.Callback() { 15031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 15131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { 15231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return mListener != null && mListener.onNavigationItemSelected(item); 15331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 15431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 15531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 1563a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes public void onMenuModeChange(MenuBuilder menu) {} 15701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki }); 1583a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mPresenter.setId(PRESENTER_NAVIGATION_VIEW_ID); 15901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mPresenter.initForMenu(context, mMenu); 160a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mPresenter.setItemIconTintList(itemIconTint); 161153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes if (textAppearanceSet) { 162153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes mPresenter.setItemTextAppearance(textAppearance); 163153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes } 164a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mPresenter.setItemTextColor(itemTextColor); 165a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mPresenter.setItemBackground(itemBackground); 16601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenu.addMenuPresenter(mPresenter); 1677c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes addView((View) mPresenter.getMenuView(this)); 1683a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 1699d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki if (a.hasValue(R.styleable.NavigationView_menu)) { 1709d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki inflateMenu(a.getResourceId(R.styleable.NavigationView_menu, 0)); 1719d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki } 1729d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki 1730cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes if (a.hasValue(R.styleable.NavigationView_headerLayout)) { 1740cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes inflateHeaderView(a.getResourceId(R.styleable.NavigationView_headerLayout, 0)); 1750cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes } 1760cf8ecaeccbd07b5259927569eaf79e9a275d34fChris Banes 1773a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes a.recycle(); 17801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 17901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 18001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 18101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki protected Parcelable onSaveInstanceState() { 18201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki Parcelable superState = super.onSaveInstanceState(); 18301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki SavedState state = new SavedState(superState); 18401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki state.menuState = new Bundle(); 18501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenu.savePresenterStates(state.menuState); 18601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return state; 18701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 18801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 18901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 19001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki protected void onRestoreInstanceState(Parcelable savedState) { 191bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas if (!(savedState instanceof SavedState)) { 192bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas super.onRestoreInstanceState(savedState); 193bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas return; 194bb58a82daf11bf3c056d1cd5887aa26435d37b69Aurimas Liutikas } 19501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki SavedState state = (SavedState) savedState; 19601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki super.onRestoreInstanceState(state.getSuperState()); 19701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mMenu.restorePresenterStates(state.menuState); 19831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 19931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 20031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki /** 20131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * Set a listener that will be notified when a menu item is clicked. 20231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * 20331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * @param listener The listener to notify 20431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */ 20531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public void setNavigationItemSelectedListener(OnNavigationItemSelectedListener listener) { 20631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki mListener = listener; 20731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 20831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 20931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki @Override 21031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki protected void onMeasure(int widthSpec, int heightSpec) { 21131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki switch (MeasureSpec.getMode(widthSpec)) { 21231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki case MeasureSpec.EXACTLY: 21331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki // Nothing to do 21431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki break; 21531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki case MeasureSpec.AT_MOST: 21631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki widthSpec = MeasureSpec.makeMeasureSpec( 21731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki Math.min(MeasureSpec.getSize(widthSpec), mMaxWidth), MeasureSpec.EXACTLY); 21831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki break; 21931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki case MeasureSpec.UNSPECIFIED: 22031a49efe2adb59e31611f6871895a3243d835127Yuichi Araki widthSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY); 22131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki break; 22231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 22331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki // Let super sort out the height 22431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki super.onMeasure(widthSpec, heightSpec); 22531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 22631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 22730d42dc19655e637644adc3846025027240bf0afYuichi Araki /** 22830d42dc19655e637644adc3846025027240bf0afYuichi Araki * @hide 22930d42dc19655e637644adc3846025027240bf0afYuichi Araki */ 23030d42dc19655e637644adc3846025027240bf0afYuichi Araki @Override 23130d42dc19655e637644adc3846025027240bf0afYuichi Araki protected void onInsetsChanged(Rect insets) { 23230d42dc19655e637644adc3846025027240bf0afYuichi Araki mPresenter.setPaddingTopDefault(insets.top); 23330d42dc19655e637644adc3846025027240bf0afYuichi Araki } 2343a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 2353a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes /** 2363a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * Inflate a menu resource into this navigation view. 2373a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * 2383a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * <p>Existing items in the menu will not be modified or removed.</p> 2393a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * 2403a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * @param resId ID of a menu resource to inflate 2413a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes */ 2423a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes public void inflateMenu(int resId) { 2439d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki mPresenter.setUpdateSuspended(true); 2443a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes getMenuInflater().inflate(resId, mMenu); 2459d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki mPresenter.setUpdateSuspended(false); 2469d9e5f050714c1f82c3c1adeab97c9a83a795d9eYuichi Araki mPresenter.updateMenuView(false); 2473a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 2483a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 24931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki /** 2503a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes * Returns the {@link Menu} instance associated with this navigation view. 25131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */ 25231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public Menu getMenu() { 25331a49efe2adb59e31611f6871895a3243d835127Yuichi Araki return mMenu; 25431a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 25531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 25631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki /** 25701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * Inflates a View and add it as a header of the navigation menu. 25801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * 25901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * @param res The layout resource ID. 26001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * @return a newly inflated View. 26101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki */ 26201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public View inflateHeaderView(@LayoutRes int res) { 2637c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes return mPresenter.inflateHeaderView(res); 26401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 26501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 26601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki /** 26701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * Adds a View as a header of the navigation menu. 26801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * 26901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * @param view The view to be added as a header of the navigation menu. 27001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki */ 27101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public void addHeaderView(@NonNull View view) { 27201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki mPresenter.addHeaderView(view); 27301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 27401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 27501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki /** 27601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * Removes a previously-added header view. 27701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * 27801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * @param view The view to remove 27901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki */ 28001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public void removeHeaderView(@NonNull View view) { 2817c89489dcb1e7cc454da4375c387caf20201acb7Chris Banes mPresenter.removeHeaderView(view); 28201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 28301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 28401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki /** 285cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * Gets the number of headers in this NavigationView. 286cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * 287cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * @return A positive integer representing the number of headers. 288cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki */ 289cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki public int getHeaderCount() { 290cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki return mPresenter.getHeaderCount(); 291cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki } 292cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki 293cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki /** 294cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * Gets the header view at the specified position. 295cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * 296cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * @param index The position at which to get the view from. 297cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * @return The header view the specified position or null if the position does not exist in this 298cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki * NavigationView. 299cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki */ 300cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki public View getHeaderView(int index) { 301cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki return mPresenter.getHeaderView(index); 302cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki } 303cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki 304cdccc4c6d5f1e40610ce4df4afeb1f99cbdb63e8Yuichi Araki /** 3058ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Returns the tint which is applied to our menu items' icons. 306a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 307a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @see #setItemIconTintList(ColorStateList) 308d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki * 309a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @attr ref R.styleable#NavigationView_itemIconTint 310d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki */ 311d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki @Nullable 312a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public ColorStateList getItemIconTintList() { 313d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki return mPresenter.getItemTintList(); 314d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 315d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 316d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki /** 3178ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Set the tint which is applied to our menu items' icons. 318a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 319a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @param tint the tint to apply. 320a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 321a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @attr ref R.styleable#NavigationView_itemIconTint 322a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes */ 323a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public void setItemIconTintList(@Nullable ColorStateList tint) { 324a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mPresenter.setItemIconTintList(tint); 325a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 326a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 327a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes /** 3288ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Returns the tint which is applied to our menu items' icons. 329a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 330a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @see #setItemTextColor(ColorStateList) 331a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 332a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @attr ref R.styleable#NavigationView_itemTextColor 333a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes */ 334a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes @Nullable 335a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public ColorStateList getItemTextColor() { 336a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return mPresenter.getItemTextColor(); 337a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 338a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 339a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes /** 3408ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Set the text color to be used on our menu items. 341a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 342a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @see #getItemTextColor() 343d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki * 344a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @attr ref R.styleable#NavigationView_itemTextColor 345d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki */ 346a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public void setItemTextColor(@Nullable ColorStateList textColor) { 347a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mPresenter.setItemTextColor(textColor); 348d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 349d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 350d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki /** 3518ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Returns the background drawable for our menu items. 352d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki * 353d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki * @see #setItemBackgroundResource(int) 354a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 355a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * @attr ref R.styleable#NavigationView_itemBackground 356d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki */ 3578ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov @Nullable 358a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public Drawable getItemBackground() { 359a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return mPresenter.getItemBackground(); 360a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 361a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 362a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes /** 3638ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Set the background of our menu items to the given resource. 364a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 365a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @param resId The identifier of the resource. 366a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 367a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @attr ref R.styleable#NavigationView_itemBackground 368a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes */ 369a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes public void setItemBackgroundResource(@DrawableRes int resId) { 370a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes setItemBackground(ContextCompat.getDrawable(getContext(), resId)); 371d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 372d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 373d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki /** 3748ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * Set the background of our menu items to a given resource. The resource should refer to 3758ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov * a Drawable object or null to use the default background set on this navigation menu. 376d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki * 377a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * @attr ref R.styleable#NavigationView_itemBackground 378d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki */ 3798ea47e618ba5dad21c7b023aa998979eebcf2103Kirill Grouchnikov public void setItemBackground(@Nullable Drawable itemBackground) { 380a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes mPresenter.setItemBackground(itemBackground); 381d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki } 382d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki 383f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki /** 384f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki * Sets the currently checked item in this navigation menu. 385f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki * 386f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki * @param id The item ID of the currently checked item. 387f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki */ 388f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki public void setCheckedItem(@IdRes int id) { 389f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki MenuItem item = mMenu.findItem(id); 390f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki if (item != null) { 391f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki mPresenter.setCheckedItem((MenuItemImpl) item); 392f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki } 393f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki } 394f9b8005bf607feddd9b482f817bd68c46739e4f1Yuichi Araki 395153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes /** 396153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes * Set the text appearance of the menu items to a given resource. 397153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes * 398153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes * @attr ref R.styleable#NavigationView_itemTextAppearance 399153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes */ 400153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes public void setItemTextAppearance(@StyleRes int resId) { 401153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes mPresenter.setItemTextAppearance(resId); 402153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes } 403153fa9a03422419cd56b7d17def1ae907fc7b5cfChris Banes 4043a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes private MenuInflater getMenuInflater() { 4053a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes if (mMenuInflater == null) { 4063a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes mMenuInflater = new SupportMenuInflater(getContext()); 4073a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 4083a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes return mMenuInflater; 4093a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes } 4103a2c9c408e240e761b043139c5d228d3ad93f6c2Chris Banes 411a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes private ColorStateList createDefaultColorStateList(int baseColorThemeAttr) { 412a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes TypedValue value = new TypedValue(); 413a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes if (!getContext().getTheme().resolveAttribute(baseColorThemeAttr, value, true)) { 414a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return null; 415a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 416a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes ColorStateList baseColor = getResources().getColorStateList(value.resourceId); 4176759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski if (!getContext().getTheme().resolveAttribute( 4186759b1021d8198ad1d239bb30e5a102b99624bceAdam Lesinski android.support.v7.appcompat.R.attr.colorPrimary, value, true)) { 419a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return null; 420a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 4210eda28cff720158c50d0b455663b599830f78992Chris Banes int colorPrimary = value.data; 422a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes int defaultColor = baseColor.getDefaultColor(); 423a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes return new ColorStateList(new int[][]{ 424a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes DISABLED_STATE_SET, 425a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes CHECKED_STATE_SET, 426a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes EMPTY_STATE_SET 427a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes }, new int[]{ 428a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes baseColor.getColorForState(DISABLED_STATE_SET, defaultColor), 4290eda28cff720158c50d0b455663b599830f78992Chris Banes colorPrimary, 430a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes defaultColor 431a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes }); 432a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes } 433a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes 434d3ee2c7d22c0cb204ea9077fa9e64511266d6799Yuichi Araki /** 435a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * Listener for handling events on navigation items. 43631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */ 43731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public interface OnNavigationItemSelectedListener { 43831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 43931a49efe2adb59e31611f6871895a3243d835127Yuichi Araki /** 440a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * Called when an item in the navigation menu is selected. 44131a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * 44231a49efe2adb59e31611f6871895a3243d835127Yuichi Araki * @param item The selected item 443a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * 444a63940ca14cd3ad9620e94f709930bb968525c57Chris Banes * @return true to display the item as the selected item 44531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki */ 44631a49efe2adb59e31611f6871895a3243d835127Yuichi Araki public boolean onNavigationItemSelected(MenuItem item); 44731a49efe2adb59e31611f6871895a3243d835127Yuichi Araki } 44831a49efe2adb59e31611f6871895a3243d835127Yuichi Araki 44901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki /** 450a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9fYuichi Araki * User interface state that is stored by NavigationView for implementing 45101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki * onSaveInstanceState(). 45201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki */ 45305f5ba020fa6caa658c75b6d77436aa980ca0fccChris Banes public static class SavedState extends AbsSavedState { 45401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public Bundle menuState; 45501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 45662ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes public SavedState(Parcel in, ClassLoader loader) { 45705f5ba020fa6caa658c75b6d77436aa980ca0fccChris Banes super(in, loader); 45862ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes menuState = in.readBundle(loader); 45901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 46001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 46101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public SavedState(Parcelable superState) { 46201090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki super(superState); 46301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 46401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 46501090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 46601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public void writeToParcel(@NonNull Parcel dest, int flags) { 46701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki super.writeToParcel(dest, flags); 46801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki dest.writeBundle(menuState); 46901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 47001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 47101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public static final Parcelable.Creator<SavedState> CREATOR 47262ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<SavedState>() { 47301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 47462ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes public SavedState createFromParcel(Parcel parcel, ClassLoader loader) { 47562ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes return new SavedState(parcel, loader); 47601090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 47701090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 47801090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki @Override 47901090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki public SavedState[] newArray(int size) { 48001090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki return new SavedState[size]; 48101090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 48262ab25d71ccfa775a8bd2add7b41277bc4e14bbcChris Banes }); 48301090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki } 48401090f9556e7518c9ee206de6efe42de9003f6f5Yuichi Araki 48531a49efe2adb59e31611f6871895a3243d835127Yuichi Araki} 486