NavigationMenuItemView.java revision a5081dfb26b3664d97d5fe09b9b6a9c9667e0e9f
18965a6a0d2165f32e6413594bba6367f271f51e7vladlosev/* 28965a6a0d2165f32e6413594bba6367f271f51e7vladlosev * Copyright (C) 2015 The Android Open Source Project 38965a6a0d2165f32e6413594bba6367f271f51e7vladlosev * 4532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * Licensed under the Apache License, Version 2.0 (the "License"); 5532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * you may not use this file except in compliance with the License. 6532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * You may obtain a copy of the License at 7532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * 8532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * http://www.apache.org/licenses/LICENSE-2.0 9532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * 10532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * Unless required by applicable law or agreed to in writing, software 11532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * distributed under the License is distributed on an "AS IS" BASIS, 12532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * See the License for the specific language governing permissions and 14532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * limitations under the License. 15532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan */ 16532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 17532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanpackage android.support.design.internal; 18532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 19532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.content.Context; 20532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.content.res.ColorStateList; 21532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.Color; 22532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.drawable.ColorDrawable; 23532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.drawable.Drawable; 24532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.graphics.drawable.StateListDrawable; 25532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.design.R; 26532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v4.graphics.drawable.DrawableCompat; 27532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v4.widget.TextViewCompat; 28532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v7.internal.view.menu.MenuItemImpl; 29532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.support.v7.internal.view.menu.MenuView; 30532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.util.AttributeSet; 31532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.util.TypedValue; 32532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.view.View; 33532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wanimport android.widget.TextView; 34532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 35532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan/** 36532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan * @hide 37532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan */ 384853a503371f39aa22e14adcdecea71c09841e34zhanyong.wanpublic class NavigationMenuItemView extends TextView implements MenuView.ItemView { 394853a503371f39aa22e14adcdecea71c09841e34zhanyong.wan 40532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; 41532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 42532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan private static final int[] DISABLED_STATE_SET = {-android.R.attr.state_enabled}; 43ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan 44ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan private int mIconSize; 45ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan 46ed8500b341c473ecf46acd13951ae5b4e3acc780zhanyong.wan private MenuItemImpl mItemData; 47cfcbc298cd91806e0e3417e03fce42bc4f1fa150vladlosev 48cfcbc298cd91806e0e3417e03fce42bc4f1fa150vladlosev private ColorStateList mTintList; 49ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan 50e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan public NavigationMenuItemView(Context context) { 51ffeb11d14a890b902dbb26ff2296cda7bf2d31dfzhanyong.wan this(context, null); 52e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan } 53e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan 54e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan public NavigationMenuItemView(Context context, AttributeSet attrs) { 55e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan this(context, attrs, 0); 567d1051ce2b3be67d27b200d0050a7ec88c18621bkosak } 577d1051ce2b3be67d27b200d0050a7ec88c18621bkosak 587d1051ce2b3be67d27b200d0050a7ec88c18621bkosak public NavigationMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) { 597d1051ce2b3be67d27b200d0050a7ec88c18621bkosak super(context, attrs, defStyleAttr); 607d1051ce2b3be67d27b200d0050a7ec88c18621bkosak mIconSize = context.getResources().getDimensionPixelSize(R.dimen.navigation_icon_size); 617d1051ce2b3be67d27b200d0050a7ec88c18621bkosak } 627d1051ce2b3be67d27b200d0050a7ec88c18621bkosak 637d1051ce2b3be67d27b200d0050a7ec88c18621bkosak @Override 64532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public void initialize(MenuItemImpl itemData, int menuType) { 65532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan mItemData = itemData; 66e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan 67e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); 68e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan 69e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan if (mTintList == null && (itemData.isChecked() || !itemData.isEnabled())) { 70e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan mTintList = createDefaultTintList(); 71e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setTextColor(mTintList); 72e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan } 73e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan if (getBackground() == null) { 74e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setBackgroundDrawable(createDefaultBackground()); 75e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan } 76e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan 77e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setCheckable(itemData.isCheckable()); 78e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setChecked(itemData.isChecked()); 79e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setTitle(itemData.getTitle()); 80e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setIcon(itemData.getIcon()); 81e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan setEnabled(itemData.isEnabled()); 82532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 83e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan 84532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan private ColorStateList createDefaultTintList() { 85532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan TypedValue value = new TypedValue(); 86532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (!getContext().getTheme() 87532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan .resolveAttribute(android.R.attr.textColorPrimary, value, true)) { 88532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return null; 89532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 90532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan ColorStateList base = getResources().getColorStateList(value.resourceId); 91532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (!getContext().getTheme().resolveAttribute(R.attr.colorPrimary, value, true)) { 92532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return null; 93532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 94532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan int colorPrimary = value.data; 95532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan int defaultColor = base.getDefaultColor(); 96532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return new ColorStateList(new int[][]{ 97532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan DISABLED_STATE_SET, 98532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan CHECKED_STATE_SET, 99532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan EMPTY_STATE_SET 100532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan }, new int[]{ 101532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan base.getColorForState(DISABLED_STATE_SET, defaultColor), 102532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan colorPrimary, 103532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan defaultColor 104532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan }); 105532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 106532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 107532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan private StateListDrawable createDefaultBackground() { 108532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan TypedValue value = new TypedValue(); 109532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (getContext().getTheme() 110532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan .resolveAttribute(R.attr.colorControlHighlight, value, true)) { 111532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan StateListDrawable drawable = new StateListDrawable(); 112532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan drawable.addState(CHECKED_STATE_SET, new ColorDrawable(value.data)); 113532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan drawable.addState(EMPTY_STATE_SET, new ColorDrawable(Color.TRANSPARENT)); 114532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return drawable; 115532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 116532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return null; 117532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 118532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 119532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan @Override 120532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public MenuItemImpl getItemData() { 121532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return mItemData; 122532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 123532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 124532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan @Override 125532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public void setTitle(CharSequence title) { 126532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan setText(title); 127532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 128532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 129532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan @Override 130532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public void setCheckable(boolean checkable) { 131532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (checkable && mTintList != null) { 132532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan setTextColor(mTintList); 133532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 134532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 135532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 136532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan @Override 137532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public void setChecked(boolean checked) { 138532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan refreshDrawableState(); 139532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 140532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 141532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan @Override 142532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public void setShortcut(boolean showShortcut, char shortcutKey) { 143532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 144532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 145532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan @Override 146532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public void setIcon(Drawable icon) { 147532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (icon != null) { 148532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan icon = DrawableCompat.wrap(icon); 149532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan icon.setBounds(0, 0, mIconSize, mIconSize); 150532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan icon = icon.mutate(); 151532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (mItemData.isChecked() || !mItemData.isEnabled()) { 152532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan DrawableCompat.setTintList(icon, mTintList); 153ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev } else { 1548965a6a0d2165f32e6413594bba6367f271f51e7vladlosev DrawableCompat.setTintList(icon, null); 1558965a6a0d2165f32e6413594bba6367f271f51e7vladlosev } 156532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 157532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan TextViewCompat.setCompoundDrawablesRelative(this, icon, null, null, null); 158ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev } 1598965a6a0d2165f32e6413594bba6367f271f51e7vladlosev 1608965a6a0d2165f32e6413594bba6367f271f51e7vladlosev @Override 161532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public boolean prefersCondensedTitle() { 162532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return false; 163ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev } 1648965a6a0d2165f32e6413594bba6367f271f51e7vladlosev 1658965a6a0d2165f32e6413594bba6367f271f51e7vladlosev @Override 166532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan public boolean showsIcon() { 167532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return true; 168ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev } 1698965a6a0d2165f32e6413594bba6367f271f51e7vladlosev 1708965a6a0d2165f32e6413594bba6367f271f51e7vladlosev @Override 171532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan protected int[] onCreateDrawableState(int extraSpace) { 172532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (mItemData != null && mItemData.isChecked()) { 173ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev return mergeDrawableStates(super.onCreateDrawableState(extraSpace + 1), 1748965a6a0d2165f32e6413594bba6367f271f51e7vladlosev CHECKED_STATE_SET); 1758965a6a0d2165f32e6413594bba6367f271f51e7vladlosev } else { 176532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan return super.onCreateDrawableState(extraSpace); 177532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan } 178ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev } 1798965a6a0d2165f32e6413594bba6367f271f51e7vladlosev 1808965a6a0d2165f32e6413594bba6367f271f51e7vladlosev public void setTintList(ColorStateList tintList) { 181532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan mTintList = tintList; 182532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan if (tintList != null) { 183ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev setTextColor(tintList); 1848965a6a0d2165f32e6413594bba6367f271f51e7vladlosev } 1858965a6a0d2165f32e6413594bba6367f271f51e7vladlosev } 186532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan 187532dc2de35f2cef191bc91c3587a9f8f4974756fzhanyong.wan} 188ff8d732cefb2e5d244d289f6c45a0850878033c0vladlosev