Toolbar.java revision e43340c80dc66c45edc793ecd0343774aa34d108
1e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell/* 2e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Copyright (C) 2014 The Android Open Source Project 3e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 4e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * you may not use this file except in compliance with the License. 6e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * You may obtain a copy of the License at 7e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 8e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * http://www.apache.org/licenses/LICENSE-2.0 9e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 10e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Unless required by applicable law or agreed to in writing, software 11e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * See the License for the specific language governing permissions and 14e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * limitations under the License. 15e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 16e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 17e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 18e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellpackage android.widget; 19e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 20e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.annotation.NonNull; 21e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.content.Context; 22e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.content.res.TypedArray; 23e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.graphics.drawable.Drawable; 24e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.os.Parcel; 25e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.os.Parcelable; 26e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.text.TextUtils; 27e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.util.AttributeSet; 28e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.Gravity; 29e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.Menu; 30e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.MenuInflater; 31e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.MenuItem; 32e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.View; 33e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.ViewDebug; 34e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport android.view.ViewGroup; 35e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport com.android.internal.R; 36e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 37e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport java.util.ArrayList; 38e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellimport java.util.List; 39e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 40e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell/** 41e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * A standard toolbar for use within application content. 42e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 43e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>A Toolbar is a generalization of {@link android.app.ActionBar action bars} for use 44e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * within application layouts. While an action bar is traditionally part of an 45e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link android.app.Activity Activity's} opaque window decor controlled by the framework, 46e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * a Toolbar may be placed at any arbitrary level of nesting within a view hierarchy. 47e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * An application may choose to designate a Toolbar as the action bar for an Activity 48e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * using the {@link android.app.Activity#setActionBar(Toolbar) setActionBar()} method.</p> 49e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 50e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>Toolbar supports a more focused feature set than ActionBar. From start to end, a toolbar 51e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * may contain a combination of the following optional elements: 52e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 53e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <ul> 54e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <li><em>A navigation button.</em> This may be an Up arrow, navigation menu toggle, close, 55e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * collapse, done or another glyph of the app's choosing. This button should always be used 56e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * to access other navigational destinations within the container of the Toolbar and 57e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * its signified content or otherwise leave the current context signified by the Toolbar.</li> 58e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <li><em>A branded logo image.</em> This may extend to the height of the bar and can be 59e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * arbitrarily wide.</li> 60e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <li><em>A title and subtitle.</em> The title should be a signpost for the Toolbar's current 61e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * position in the navigation hierarchy and the content contained there. The subtitle, 62e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * if present should indicate any extended information about the current content. 63e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * If an app uses a logo image it should strongly consider omitting a title and subtitle.</li> 64e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <li><em>One or more custom views.</em> The application may add arbitrary child views 65e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * to the Toolbar. They will appear at this position within the layout. If a child view's 66e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link LayoutParams} indicates a {@link Gravity} value of 67e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link Gravity#CENTER_HORIZONTAL CENTER_HORIZONTAL} the view will attempt to center 68e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * within the available space remaining in the Toolbar after all other elements have been 69e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * measured.</li> 70e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <li><em>An {@link ActionMenuView action menu}.</em> The menu of actions will pin to the 71e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * end of the Toolbar offering a few 72e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <a href="http://developer.android.com/design/patterns/actionbar.html#ActionButtons"> 73e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * frequent, important or typical</a> actions along with an optional overflow menu for 74e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * additional actions.</li> 75e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * </ul> 76e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * </p> 77e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 78e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>In modern Android UIs developers should lean more on a visually distinct color scheme for 79e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * toolbars than on their application icon. The use of application icon plus title as a standard 80e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * layout is discouraged on API 21 devices and newer.</p> 81e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 82e43340c80dc66c45edc793ecd0343774aa34d108Adam Powellpublic class Toolbar extends ViewGroup { 83e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private ActionMenuView mMenuView; 84e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private TextView mTitleTextView; 85e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private TextView mSubtitleTextView; 86e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private ImageButton mNavButtonView; 87e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private ImageView mLogoView; 88e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 89e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mTitleTextAppearance; 90e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mSubtitleTextAppearance; 91e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mTitleMarginStart; 92e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mTitleMarginEnd; 93e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mTitleMarginTop; 94e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mTitleMarginBottom; 95e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 96e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int mGravity = Gravity.START | Gravity.CENTER_VERTICAL; 97e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 98e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private CharSequence mTitleText; 99e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private CharSequence mSubtitleText; 100e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 101e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // Clear me after use. 102e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private final ArrayList<View> mTempViews = new ArrayList<View>(); 103e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 104e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private OnMenuItemClickListener mOnMenuItemClickListener; 105e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 106e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private final ActionMenuView.OnMenuItemClickListener mMenuViewItemClickListener = 107e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell new ActionMenuView.OnMenuItemClickListener() { 108e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 109e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public boolean onMenuItemClick(MenuItem item) { 110e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mOnMenuItemClickListener != null) { 111e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mOnMenuItemClickListener.onMenuItemClick(item); 112e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 113e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return false; 114e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 115e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell }; 116e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 117e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Toolbar(Context context) { 118e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this(context, null); 119e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 120e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 121e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Toolbar(Context context, AttributeSet attrs) { 122e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this(context, attrs, com.android.internal.R.attr.toolbarStyle); 123e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 124e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 125e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Toolbar(Context context, AttributeSet attrs, int defStyleAttr) { 126e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this(context, attrs, defStyleAttr, 0); 127e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 128e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 129e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Toolbar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 130e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(context, attrs, defStyleAttr, defStyleRes); 131e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 132e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Toolbar, 133e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell defStyleAttr, defStyleRes); 134e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 135e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0); 136e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance, 0); 137e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mGravity = a.getInteger(R.styleable.Toolbar_gravity, mGravity); 138e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleMarginStart = mTitleMarginEnd = Math.max(0, a.getDimensionPixelOffset( 139e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell R.styleable.Toolbar_titleMargins, -1)); 140e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 141e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int marginStart = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginStart, -1); 142e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (marginStart >= 0) { 143e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleMarginStart = marginStart; 144e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 145e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 146e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int marginEnd = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginEnd, -1); 147e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (marginEnd >= 0) { 148e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleMarginEnd = marginEnd; 149e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 150e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 151e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int marginTop = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginTop, -1); 152e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (marginTop >= 0) { 153e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleMarginTop = marginTop; 154e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 155e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 156e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int marginBottom = a.getDimensionPixelOffset(R.styleable.Toolbar_titleMarginBottom, 157e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell -1); 158e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (marginBottom >= 0) { 159e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleMarginBottom = marginBottom; 160e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 161e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 162e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final CharSequence title = a.getText(R.styleable.Toolbar_title); 163e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (!TextUtils.isEmpty(title)) { 164e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setTitle(title); 165e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 166e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 167e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final CharSequence subtitle = a.getText(R.styleable.Toolbar_subtitle); 168e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (!TextUtils.isEmpty(subtitle)) { 169e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setSubtitle(title); 170e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 171e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell a.recycle(); 172e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 173e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 174e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 175e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a logo drawable from a resource id. 176e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 177e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This drawable should generally take the place of title text. The logo cannot be 178e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * clicked. Apps using a logo should also supply a description using 179e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link #setLogoDescription(int)}.</p> 180e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 181e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId ID of a drawable resource 182e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 183e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setLogo(int resId) { 184e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setLogo(getContext().getDrawable(resId)); 185e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 186e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 187e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 188e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a logo drawable. 189e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 190e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This drawable should generally take the place of title text. The logo cannot be 191e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * clicked. Apps using a logo should also supply a description using 192e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link #setLogoDescription(int)}.</p> 193e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 194e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param drawable Drawable to use as a logo 195e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 196e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setLogo(Drawable drawable) { 197e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (drawable != null) { 198e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mLogoView == null) { 199e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mLogoView = new ImageView(getContext()); 200e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 201e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mLogoView.getParent() == null) { 202e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addSystemView(mLogoView); 203e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 204e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else if (mLogoView != null && mLogoView.getParent() != null) { 205e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell removeView(mLogoView); 206e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 207e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mLogoView != null) { 208e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mLogoView.setImageDrawable(drawable); 209e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 210e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 211e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 212e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 213e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Return the current logo drawable. 214e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 215e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return The current logo drawable 216e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @see #setLogo(int) 217e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @see #setLogo(android.graphics.drawable.Drawable) 218e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 219e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Drawable getLogo() { 220e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mLogoView != null ? mLogoView.getDrawable() : null; 221e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 222e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 223e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 224e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a description of the toolbar's logo. 225e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 226e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This description will be used for accessibility or other similar descriptions 227e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * of the UI.</p> 228e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 229e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId String resource id 230e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 231e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setLogoDescription(int resId) { 232e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setLogoDescription(getContext().getText(resId)); 233e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 234e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 235e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 236e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a description of the toolbar's logo. 237e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 238e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This description will be used for accessibility or other similar descriptions 239e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * of the UI.</p> 240e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 241e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param description Description to set 242e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 243e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setLogoDescription(CharSequence description) { 244e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (!TextUtils.isEmpty(description) && mLogoView == null) { 245e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mLogoView = new ImageView(getContext()); 246e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 247e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mLogoView != null) { 248e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mLogoView.setContentDescription(description); 249e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 250e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 251e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 252e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 253e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Return the description of the toolbar's logo. 254e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 255e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return A description of the logo 256e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 257e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public CharSequence getLogoDescription() { 258e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mLogoView != null ? mLogoView.getContentDescription() : null; 259e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 260e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 261e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 262e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Return the current title displayed in the toolbar. 263e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 264e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return The current title 265e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 266e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public CharSequence getTitle() { 267e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mTitleText; 268e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 269e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 270e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 271e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set the title of this toolbar. 272e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 273e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>A title should be used as the anchor for a section of content. It should 274e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * describe or name the content being viewed.</p> 275e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 276e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId Resource ID of a string to set as the title 277e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 278e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setTitle(int resId) { 279e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setTitle(getContext().getText(resId)); 280e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 281e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 282e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 283e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set the title of this toolbar. 284e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 285e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>A title should be used as the anchor for a section of content. It should 286e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * describe or name the content being viewed.</p> 287e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 288e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param title Title to set 289e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 290e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setTitle(CharSequence title) { 291e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (!TextUtils.isEmpty(title)) { 292e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mTitleTextView == null) { 293e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final Context context = getContext(); 294e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleTextView = new TextView(context); 295e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleTextView.setTextAppearance(context, mTitleTextAppearance); 296e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 297e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mTitleTextView.getParent() == null) { 298e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addSystemView(mTitleTextView); 299e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 300e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else if (mTitleTextView != null && mTitleTextView.getParent() != null) { 301e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell removeView(mTitleTextView); 302e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 303e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mTitleTextView != null) { 304e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleTextView.setText(title); 305e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 306e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleText = title; 307e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 308e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 309e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 310e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Return the subtitle of this toolbar. 311e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 312e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return The current subtitle 313e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 314e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public CharSequence getSubtitle() { 315e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mSubtitleText; 316e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 317e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 318e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 319e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set the subtitle of this toolbar. 320e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 321e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>Subtitles should express extended information about the current content.</p> 322e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 323e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId String resource ID 324e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 325e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setSubtitle(int resId) { 326e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setSubtitle(getContext().getText(resId)); 327e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 328e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 329e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 330e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set the subtitle of this toolbar. 331e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 332e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>Subtitles should express extended information about the current content.</p> 333e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 334e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param subtitle Subtitle to set 335e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 336e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setSubtitle(CharSequence subtitle) { 337e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (!TextUtils.isEmpty(subtitle)) { 338e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mSubtitleTextView == null) { 339e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final Context context = getContext(); 340e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleTextView = new TextView(context); 341e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleTextView.setTextAppearance(context, mSubtitleTextAppearance); 342e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 343e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mSubtitleTextView.getParent() == null) { 344e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addSystemView(mSubtitleTextView); 345e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 346e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else if (mSubtitleTextView != null && mSubtitleTextView.getParent() != null) { 347e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell removeView(mSubtitleTextView); 348e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 349e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mSubtitleTextView != null) { 350e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleTextView.setText(subtitle); 351e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 352e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleText = subtitle; 353e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 354e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 355e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 356e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set the icon to use for the toolbar's navigation button. 357e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 358e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>The navigation button appears at the start of the toolbar if present. Setting an icon 359e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * will make the navigation button visible.</p> 360e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 361e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>If you use a navigation icon you should also set a description for its action using 362e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link #setNavigationDescription(int)}. This is used for accessibility and tooltips.</p> 363e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 364e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId Resource ID of a drawable to set 365e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 366e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setNavigationIcon(int resId) { 367e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setNavigationIcon(getContext().getDrawable(resId)); 368e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 369e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 370e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 371e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set the icon to use for the toolbar's navigation button. 372e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 373e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>The navigation button appears at the start of the toolbar if present. Setting an icon 374e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * will make the navigation button visible.</p> 375e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 376e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>If you use a navigation icon you should also set a description for its action using 377e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * {@link #setNavigationDescription(int)}. This is used for accessibility and tooltips.</p> 378e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 379e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param icon Drawable to set 380e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 381e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setNavigationIcon(Drawable icon) { 382e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (icon != null) { 383e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell ensureNavButtonView(); 384e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mNavButtonView.getParent() == null) { 385e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addSystemView(mNavButtonView); 386e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 387e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else if (mNavButtonView != null && mNavButtonView.getParent() != null) { 388e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell removeView(mNavButtonView); 389e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 390e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mNavButtonView != null) { 391e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mNavButtonView.setImageDrawable(icon); 392e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 393e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 394e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 395e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 396e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Return the current drawable used as the navigation icon. 397e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 398e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return The navigation icon drawable 399e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 400e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Drawable getNavigationIcon() { 401e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mNavButtonView != null ? mNavButtonView.getDrawable() : null; 402e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 403e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 404e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 405e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a description for the navigation button. 406e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 407e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This description string is used for accessibility, tooltips and other facilities 408e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * to improve discoverability.</p> 409e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 410e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId Resource ID of a string to set 411e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 412e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setNavigationDescription(int resId) { 413e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setNavigationDescription(getContext().getText(resId)); 414e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 415e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 416e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 417e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a description for the navigation button. 418e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 419e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This description string is used for accessibility, tooltips and other facilities 420e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * to improve discoverability.</p> 421e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 422e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param description String to set as the description 423e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 424e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setNavigationDescription(CharSequence description) { 425e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (!TextUtils.isEmpty(description)) { 426e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell ensureNavButtonView(); 427e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 428e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mNavButtonView != null) { 429e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mNavButtonView.setContentDescription(description); 430e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 431e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 432e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 433e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 434e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a listener to respond to navigation events. 435e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 436e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This listener will be called whenever the user clicks the navigation button 437e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * at the start of the toolbar. An icon must be set for the navigation button to appear.</p> 438e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 439e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param listener Listener to set 440e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @see #setNavigationIcon(android.graphics.drawable.Drawable) 441e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 442e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setNavigationOnClickListener(OnClickListener listener) { 443e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell ensureNavButtonView(); 444e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mNavButtonView.setOnClickListener(listener); 445e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 446e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 447e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 448e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Return the Menu shown in the toolbar. 449e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 450e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>Applications that wish to populate the toolbar's menu can do so from here. To use 451e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * an XML menu resource, use {@link #inflateMenu(int)}.</p> 452e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 453e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return The toolbar's Menu 454e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 455e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public Menu getMenu() { 456e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mMenuView == null) { 457e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mMenuView = new ActionMenuView(getContext()); 458e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mMenuView.setOnMenuItemClickListener(mMenuViewItemClickListener); 459e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addSystemView(mMenuView); 460e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 461e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mMenuView.getMenu(); 462e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 463e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 464e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private MenuInflater getMenuInflater() { 465e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new MenuInflater(getContext()); 466e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 467e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 468e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 469e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Inflate a menu resource into this toolbar. 470e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 471e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>Inflate an XML menu resource into this toolbar. Existing items in the menu will not 472e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * be modified or removed.</p> 473e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 474e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param resId ID of a menu resource to inflate 475e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 476e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void inflateMenu(int resId) { 477e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getMenuInflater().inflate(resId, getMenu()); 478e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 479e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 480e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 481e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Set a listener to respond to menu item click events. 482e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 483e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * <p>This listener will be invoked whenever a user selects a menu item from 484e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * the action buttons presented at the end of the toolbar or the associated overflow.</p> 485e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 486e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param listener Listener to set 487e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 488e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { 489e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mOnMenuItemClickListener = listener; 490e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 491e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 492e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private void ensureNavButtonView() { 493e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (mNavButtonView == null) { 494e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mNavButtonView = new ImageButton(getContext(), null, R.attr.borderlessButtonStyle); 495e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 496e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 497e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 498e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private void addSystemView(View v) { 499e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, 500e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell LayoutParams.WRAP_CONTENT); 501e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell lp.mViewType = LayoutParams.SYSTEM; 502e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addView(v, lp); 503e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 504e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 505e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 506e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected Parcelable onSaveInstanceState() { 507e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell SavedState state = new SavedState(super.onSaveInstanceState()); 508e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return state; 509e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 510e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 511e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 512e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected void onRestoreInstanceState(Parcelable state) { 513e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final SavedState ss = (SavedState) state; 514e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super.onRestoreInstanceState(ss.getSuperState()); 515e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 516e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 517e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 518e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 519e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int width = 0; 520e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int height = 0; 521e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int childState = 0; 522e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 523e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // System views measure first. 524e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 525e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mNavButtonView)) { 526e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell measureChildWithMargins(mNavButtonView, widthMeasureSpec, width, heightMeasureSpec, 0); 527e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += mNavButtonView.getMeasuredWidth() + getHorizontalMargins(mNavButtonView); 528e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell height = Math.max(height, mNavButtonView.getMeasuredHeight() + 529e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getVerticalMargins(mNavButtonView)); 530e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell childState = combineMeasuredStates(childState, mNavButtonView.getMeasuredState()); 531e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 532e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 533e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mMenuView)) { 534e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell measureChildWithMargins(mMenuView, widthMeasureSpec, width, heightMeasureSpec, 0); 535e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += mMenuView.getMeasuredWidth() + getHorizontalMargins(mMenuView); 536e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell height = Math.max(height, mMenuView.getMeasuredHeight() + 537e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getVerticalMargins(mMenuView)); 538e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell childState = combineMeasuredStates(childState, mMenuView.getMeasuredState()); 539e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 540e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 541e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mLogoView)) { 542e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell measureChildWithMargins(mLogoView, widthMeasureSpec, width, heightMeasureSpec, 0); 543e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += mLogoView.getMeasuredWidth() + getHorizontalMargins(mLogoView); 544e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell height = Math.max(height, mLogoView.getMeasuredHeight() + 545e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getVerticalMargins(mLogoView)); 546e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell childState = combineMeasuredStates(childState, mLogoView.getMeasuredState()); 547e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 548e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 549e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int titleWidth = 0; 550e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int titleHeight = 0; 551e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int titleVertMargins = mTitleMarginTop + mTitleMarginBottom; 552e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int titleHorizMargins = mTitleMarginStart + mTitleMarginEnd; 553e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mTitleTextView)) { 554e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell measureChildWithMargins(mTitleTextView, widthMeasureSpec, width + titleHorizMargins, 555e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell heightMeasureSpec, titleVertMargins); 556e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleWidth = mTitleTextView.getMeasuredWidth() + getHorizontalMargins(mTitleTextView); 557e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleHeight = mTitleTextView.getMeasuredHeight() + getVerticalMargins(mTitleTextView); 558e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell childState = combineMeasuredStates(childState, mTitleTextView.getMeasuredState()); 559e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 560e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mSubtitleTextView)) { 561e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell measureChildWithMargins(mSubtitleTextView, widthMeasureSpec, width + titleHorizMargins, 562e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell heightMeasureSpec, titleHeight + titleVertMargins); 563e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleWidth = Math.max(titleWidth, mSubtitleTextView.getMeasuredWidth() + 564e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getHorizontalMargins(mSubtitleTextView)); 565e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleHeight += mSubtitleTextView.getMeasuredHeight() + 566e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getVerticalMargins(mSubtitleTextView); 567e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell childState = combineMeasuredStates(childState, mSubtitleTextView.getMeasuredState()); 568e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 569e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 570e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += titleWidth; 571e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell height = Math.max(height, titleHeight); 572e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 573e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int childCount = getChildCount(); 574e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = 0; i < childCount; i++) { 575e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final View child = getChildAt(i); 576e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 577e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (lp.mViewType == LayoutParams.SYSTEM || !shouldLayout(child)) { 578e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // We already got all system views above. Skip them and GONE views. 579e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell continue; 580e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 581e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 582e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell measureChildWithMargins(child, widthMeasureSpec, width, heightMeasureSpec, 0); 583e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += child.getMeasuredWidth() + getHorizontalMargins(child); 584e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell height = Math.max(height, child.getMeasuredHeight() + getVerticalMargins(child)); 585e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell childState = combineMeasuredStates(childState, child.getMeasuredState()); 586e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 587e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 588e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // Measurement already took padding into account for available space for the children, 589e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // add it in for the final size. 590e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += getPaddingLeft() + getPaddingRight(); 591e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell height += getPaddingTop() + getPaddingBottom(); 592e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 593e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int measuredWidth = resolveSizeAndState( 594e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell Math.max(width, getSuggestedMinimumWidth()), 595e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell widthMeasureSpec, childState & MEASURED_STATE_MASK); 596e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int measuredHeight = resolveSizeAndState( 597e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell Math.max(height, getSuggestedMinimumHeight()), 598e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell heightMeasureSpec, childState << MEASURED_HEIGHT_STATE_SHIFT); 599e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell setMeasuredDimension(measuredWidth, measuredHeight); 600e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 601e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 602e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 603e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected void onLayout(boolean changed, int l, int t, int r, int b) { 604e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; 605e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int width = getWidth(); 606e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int height = getHeight(); 607e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int paddingLeft = getPaddingLeft(); 608e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int paddingRight = getPaddingRight(); 609e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int paddingTop = getPaddingTop(); 610e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int paddingBottom = getPaddingBottom(); 611e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int left = paddingLeft; 612e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int right = width - paddingRight; 613e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 614e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mNavButtonView)) { 615e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (isRtl) { 616e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right = layoutChildRight(mNavButtonView, right); 617e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 618e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left = layoutChildLeft(mNavButtonView, left); 619e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 620e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 621e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 622e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mMenuView)) { 623e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (isRtl) { 624e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left = layoutChildLeft(mMenuView, left); 625e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 626e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right = layoutChildRight(mMenuView, right); 627e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 628e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 629e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 630e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (shouldLayout(mLogoView)) { 631e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (isRtl) { 632e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right = layoutChildRight(mLogoView, right); 633e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 634e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left = layoutChildLeft(mLogoView, left); 635e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 636e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 637e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 638e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final boolean layoutTitle = shouldLayout(mTitleTextView); 639e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final boolean layoutSubtitle = shouldLayout(mSubtitleTextView); 640e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int titleHeight = 0; 641e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutTitle) { 642e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); 643e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleHeight += lp.topMargin + mTitleTextView.getMeasuredHeight() + lp.bottomMargin; 644e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 645e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutSubtitle) { 646e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); 647e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleHeight += lp.bottomMargin + mTitleTextView.getMeasuredHeight() + lp.bottomMargin; 648e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 649e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 650e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutTitle || layoutSubtitle) { 651e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int titleTop; 652e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell switch (mGravity & Gravity.VERTICAL_GRAVITY_MASK) { 653e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.TOP: 654e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = getPaddingTop(); 655e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell break; 656e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell default: 657e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.CENTER_VERTICAL: 658e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final View child = layoutTitle ? mTitleTextView : mSubtitleTextView; 659e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 660e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int space = height - paddingTop - paddingBottom; 661e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int spaceAbove = (space - titleHeight) / 2; 662e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (spaceAbove < lp.topMargin + mTitleMarginTop) { 663e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell spaceAbove = lp.topMargin + mTitleMarginTop; 664e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 665e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int spaceBelow = height - paddingBottom - titleHeight - 666e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell spaceAbove - paddingTop; 667e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (spaceBelow < lp.bottomMargin + mTitleMarginBottom) { 668e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell spaceAbove = Math.max(0, spaceAbove - 669e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell (lp.bottomMargin + mTitleMarginBottom - spaceBelow)); 670e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 671e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 672e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = paddingTop + spaceAbove; 673e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell break; 674e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.BOTTOM: 675e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = height - paddingBottom - titleHeight; 676e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell break; 677e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 678e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (isRtl) { 679e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int titleRight = right; 680e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int subtitleRight = right; 681e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop += mTitleMarginTop; 682e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutTitle) { 683e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); 684e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleRight -= lp.rightMargin + mTitleMarginStart; 685e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop += lp.topMargin; 686e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int titleLeft = titleRight - mTitleTextView.getMeasuredWidth(); 687e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight(); 688e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom); 689e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleRight = titleLeft - lp.leftMargin - mTitleMarginEnd; 690e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = titleBottom + lp.bottomMargin; 691e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 692e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutSubtitle) { 693e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); 694e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell subtitleRight -= lp.rightMargin + mTitleMarginStart; 695e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop += lp.topMargin; 696e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int subtitleLeft = subtitleRight - mSubtitleTextView.getMeasuredWidth(); 697e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight(); 698e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom); 699e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell subtitleRight = subtitleRight - lp.leftMargin - mTitleMarginEnd; 700e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = subtitleBottom + lp.bottomMargin; 701e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 702e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right = Math.max(titleRight, subtitleRight); 703e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 704e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int titleLeft = left; 705e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int subtitleLeft = left; 706e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop += mTitleMarginTop; 707e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutTitle) { 708e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) mTitleTextView.getLayoutParams(); 709e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleLeft += lp.leftMargin + mTitleMarginStart; 710e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop += lp.topMargin; 711e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int titleRight = titleLeft + mTitleTextView.getMeasuredWidth(); 712e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int titleBottom = titleTop + mTitleTextView.getMeasuredHeight(); 713e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTitleTextView.layout(titleLeft, titleTop, titleRight, titleBottom); 714e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleLeft = titleRight + lp.rightMargin + mTitleMarginEnd; 715e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = titleBottom + lp.bottomMargin; 716e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 717e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (layoutSubtitle) { 718e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) mSubtitleTextView.getLayoutParams(); 719e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell subtitleLeft += lp.leftMargin + mTitleMarginStart; 720e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop += lp.topMargin; 721e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int subtitleRight = subtitleLeft + mSubtitleTextView.getMeasuredWidth(); 722e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int subtitleBottom = titleTop + mSubtitleTextView.getMeasuredHeight(); 723e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mSubtitleTextView.layout(subtitleLeft, titleTop, subtitleRight, subtitleBottom); 724e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell subtitleLeft = subtitleRight + lp.rightMargin + mTitleMarginEnd; 725e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell titleTop = subtitleBottom + lp.bottomMargin; 726e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 727e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left = Math.max(titleLeft, subtitleLeft); 728e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 729e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 730e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 731e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // Get all remaining children sorted for layout. This is all prepared 732e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // such that absolute layout direction can be used below. 733e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 734e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addCustomViewsWithGravity(mTempViews, Gravity.LEFT); 735e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int leftViewsCount = mTempViews.size(); 736e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = 0; i < leftViewsCount; i++) { 737e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left = layoutChildLeft(getChildAt(i), left); 738e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 739e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 740e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addCustomViewsWithGravity(mTempViews, Gravity.RIGHT); 741e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int rightViewsCount = mTempViews.size(); 742e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = 0; i < rightViewsCount; i++) { 743e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right = layoutChildRight(getChildAt(i), right); 744e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 745e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 746e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // Centered views try to center with respect to the whole bar, but views pinned 747e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell // to the left or right can push the mass of centered views to one side or the other. 748e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell addCustomViewsWithGravity(mTempViews, Gravity.CENTER); 749e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int centerViewsWidth = getViewListMeasuredWidth(mTempViews); 750e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int parentCenter = paddingLeft + (width - paddingLeft - paddingRight) / 2; 751e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int halfCenterViewsWidth = centerViewsWidth / 2; 752e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int centerLeft = parentCenter - halfCenterViewsWidth; 753e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int centerRight = centerLeft + centerViewsWidth; 754e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (centerLeft < left) { 755e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell centerLeft = left; 756e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else if (centerRight > right) { 757e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell centerLeft -= centerRight - right; 758e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 759e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 760e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int centerViewsCount = mTempViews.size(); 761e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = 0; i < centerViewsCount; i++) { 762e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell centerLeft = layoutChildLeft(getChildAt(i), centerLeft); 763e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 764e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell mTempViews.clear(); 765e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 766e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 767e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int getViewListMeasuredWidth(List<View> views) { 768e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int width = 0; 769e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int count = views.size(); 770e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = 0; i < count; i++) { 771e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final View v = views.get(i); 772e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) v.getLayoutParams(); 773e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell width += lp.leftMargin + v.getMeasuredWidth() + lp.rightMargin; 774e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 775e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return width; 776e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 777e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 778e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int layoutChildLeft(View child, int left) { 779e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 780e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left += lp.leftMargin; 781e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int top = getChildTop(child); 782e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight()); 783e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell left += lp.rightMargin; 784e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return left; 785e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 786e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 787e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int layoutChildRight(View child, int right) { 788e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 789e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right -= lp.rightMargin; 790e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int top = getChildTop(child); 791e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell child.layout(right - child.getMeasuredWidth(), top, right, top + child.getMeasuredHeight()); 792e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell right -= lp.leftMargin; 793e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return right; 794e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 795e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 796e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int getChildTop(View child) { 797e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 798e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell switch (getChildVerticalGravity(lp.gravity)) { 799e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.TOP: 800e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return getPaddingTop(); 801e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 802e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.BOTTOM: 803e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return getPaddingBottom() - child.getMeasuredHeight() - lp.bottomMargin; 804e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 805e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell default: 806e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.CENTER_VERTICAL: 807e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int paddingTop = getPaddingTop(); 808e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int paddingBottom = getPaddingBottom(); 809e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int height = getHeight(); 810e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int childHeight = child.getMeasuredHeight(); 811e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int space = height - paddingTop - paddingBottom; 812e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int spaceAbove = (space - childHeight) / 2; 813e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (spaceAbove < lp.topMargin) { 814e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell spaceAbove = lp.topMargin; 815e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 816e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int spaceBelow = height - paddingBottom - childHeight - 817e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell spaceAbove - paddingTop; 818e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (spaceBelow < lp.bottomMargin) { 819e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell spaceAbove = Math.max(0, spaceAbove - (lp.bottomMargin - spaceBelow)); 820e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 821e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 822e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return paddingTop + spaceAbove; 823e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 824e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 825e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 826e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int getChildVerticalGravity(int gravity) { 827e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int vgrav = gravity & Gravity.VERTICAL_GRAVITY_MASK; 828e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell switch (vgrav) { 829e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.TOP: 830e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.BOTTOM: 831e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.CENTER_VERTICAL: 832e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return vgrav; 833e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell default: 834e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mGravity & Gravity.VERTICAL_GRAVITY_MASK; 835e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 836e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 837e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 838e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 839e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Prepare a list of non-SYSTEM child views. If the layout direction is RTL 840e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * this will be in reverse child order. 841e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 842e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param views List to populate. It will be cleared before use. 843e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param gravity Horizontal gravity to match against 844e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 845e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private void addCustomViewsWithGravity(List<View> views, int gravity) { 846e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; 847e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int childCount = getChildCount(); 848e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int absGrav = Gravity.getAbsoluteGravity(gravity, getLayoutDirection()); 849e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 850e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell views.clear(); 851e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 852e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (isRtl) { 853e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = childCount - 1; i >= 0; i--) { 854e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final View child = getChildAt(i); 855e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 856e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (lp.mViewType != LayoutParams.SYSTEM && shouldLayout(child) && 857e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getChildHorizontalGravity(lp.gravity) == absGrav) { 858e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell views.add(child); 859e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 860e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 861e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 862e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 863e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell for (int i = 0; i < childCount; i++) { 864e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final View child = getChildAt(i); 865e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 866e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (lp.mViewType != LayoutParams.SYSTEM && shouldLayout(child) && 867e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell getChildHorizontalGravity(lp.gravity) == absGrav) { 868e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell views.add(child); 869e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 870e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 871e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 872e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 873e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 874e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int getChildHorizontalGravity(int gravity) { 875e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int ld = getLayoutDirection(); 876e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int absGrav = Gravity.getAbsoluteGravity(gravity, ld); 877e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final int hGrav = absGrav & Gravity.HORIZONTAL_GRAVITY_MASK; 878e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell switch (hGrav) { 879e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.LEFT: 880e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.RIGHT: 881e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell case Gravity.CENTER_HORIZONTAL: 882e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return hGrav; 883e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell default: 884e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return ld == LAYOUT_DIRECTION_RTL ? Gravity.RIGHT : Gravity.LEFT; 885e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 886e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 887e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 888e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private boolean shouldLayout(View view) { 889e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return view != null && view.getParent() == this && view.getVisibility() != GONE; 890e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 891e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 892e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int getHorizontalMargins(View v) { 893e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); 894e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mlp.getMarginStart() + mlp.getMarginEnd(); 895e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 896e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 897e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private int getVerticalMargins(View v) { 898e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell final MarginLayoutParams mlp = (MarginLayoutParams) v.getLayoutParams(); 899e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return mlp.topMargin + mlp.bottomMargin; 900e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 901e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 902e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 903e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { 904e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return super.generateLayoutParams(attrs); 905e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 906e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 907e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 908e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 909e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell if (p instanceof LayoutParams) { 910e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new LayoutParams((LayoutParams) p); 911e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else if (p instanceof MarginLayoutParams) { 912e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new LayoutParams((MarginLayoutParams) p); 913e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } else { 914e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new LayoutParams(p); 915e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 916e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 917e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 918e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 919e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected ViewGroup.LayoutParams generateDefaultLayoutParams() { 920e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 921e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 922e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 923e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 924e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 925e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return super.checkLayoutParams(p) && p instanceof LayoutParams; 926e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 927e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 928e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell private static boolean isCustomView(View child) { 929e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return ((LayoutParams) child.getLayoutParams()).mViewType == LayoutParams.CUSTOM; 930e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 931e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 932e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 933e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Interface responsible for receiving menu item click events if the items themselves 934e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * do not have individual item click listeners. 935e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 936e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public interface OnMenuItemClickListener { 937e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 938e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * This method will be invoked when a menu item is clicked if the item itself did 939e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * not already handle the event. 940e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 941e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @param item {@link MenuItem} that was clicked 942e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @return <code>true</code> if the event was handled, <code>false</code> otherwise. 943e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 944e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public boolean onMenuItemClick(MenuItem item); 945e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 946e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 947e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 948e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Layout information for child views of Toolbars. 949e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 950e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @attr ref android.R.styleable#Toolbar_LayoutParams_layout_gravity 951e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 952e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public static class LayoutParams extends MarginLayoutParams { 953e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell /** 954e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * Gravity for the view associated with these LayoutParams. 955e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * 956e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell * @see android.view.Gravity 957e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell */ 958e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.ExportedProperty(category = "layout", mapping = { 959e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = -1, to = "NONE"), 960e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.NO_GRAVITY, to = "NONE"), 961e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.TOP, to = "TOP"), 962e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.BOTTOM, to = "BOTTOM"), 963e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.LEFT, to = "LEFT"), 964e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.RIGHT, to = "RIGHT"), 965e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.START, to = "START"), 966e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.END, to = "END"), 967e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.CENTER_VERTICAL, to = "CENTER_VERTICAL"), 968e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.FILL_VERTICAL, to = "FILL_VERTICAL"), 969e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.CENTER_HORIZONTAL, to = "CENTER_HORIZONTAL"), 970e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.FILL_HORIZONTAL, to = "FILL_HORIZONTAL"), 971e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.CENTER, to = "CENTER"), 972e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @ViewDebug.IntToString(from = Gravity.FILL, to = "FILL") 973e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell }) 974e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public int gravity = Gravity.NO_GRAVITY; 975e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 976e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell static final int CUSTOM = 0; 977e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell static final int SYSTEM = 1; 978e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 979e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell int mViewType = CUSTOM; 980e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 981e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(@NonNull Context c, AttributeSet attrs) { 982e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(c, attrs); 983e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 984e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell TypedArray a = c.obtainStyledAttributes(attrs, 985e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell com.android.internal.R.styleable.Toolbar_LayoutParams); 986e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell gravity = a.getInt( 987e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell com.android.internal.R.styleable.Toolbar_LayoutParams_layout_gravity, 988e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell Gravity.NO_GRAVITY); 989e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell a.recycle(); 990e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 991e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 992e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(int width, int height) { 993e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(width, height); 994e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this.gravity = Gravity.CENTER_VERTICAL | Gravity.START; 995e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 996e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 997e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(int width, int height, int gravity) { 998e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(width, height); 999e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this.gravity = gravity; 1000e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1001e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1002e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(int gravity) { 1003e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this(WRAP_CONTENT, MATCH_PARENT, gravity); 1004e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1005e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1006e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(LayoutParams source) { 1007e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(source); 1008e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1009e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell this.gravity = source.gravity; 1010e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1011e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1012e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(MarginLayoutParams source) { 1013e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(source); 1014e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1015e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1016e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public LayoutParams(ViewGroup.LayoutParams source) { 1017e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(source); 1018e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1019e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1020e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1021e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell static class SavedState extends BaseSavedState { 1022e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public SavedState(Parcel source) { 1023e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(source); 1024e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1025e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1026e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public SavedState(Parcelable superState) { 1027e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super(superState); 1028e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1029e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1030e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 1031e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public void writeToParcel(Parcel out, int flags) { 1032e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell super.writeToParcel(out, flags); 1033e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1034e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1035e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { 1036e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1037e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 1038e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public SavedState createFromParcel(Parcel source) { 1039e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new SavedState(source); 1040e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1041e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell 1042e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell @Override 1043e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell public SavedState[] newArray(int size) { 1044e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell return new SavedState[size]; 1045e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1046e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell }; 1047e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell } 1048e43340c80dc66c45edc793ecd0343774aa34d108Adam Powell} 1049