1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.v7.app;
18
19import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
20
21import android.content.Context;
22import android.content.res.Configuration;
23import android.content.res.TypedArray;
24import android.graphics.drawable.Drawable;
25import android.support.annotation.DrawableRes;
26import android.support.annotation.IntDef;
27import android.support.annotation.NonNull;
28import android.support.annotation.Nullable;
29import android.support.annotation.RestrictTo;
30import android.support.annotation.StringRes;
31import android.support.v4.app.Fragment;
32import android.support.v4.app.FragmentTransaction;
33import android.support.v4.view.GravityCompat;
34import android.support.v7.appcompat.R;
35import android.support.v7.view.ActionMode;
36import android.util.AttributeSet;
37import android.view.Gravity;
38import android.view.KeyEvent;
39import android.view.View;
40import android.view.ViewGroup;
41import android.view.Window;
42import android.widget.SpinnerAdapter;
43
44import java.lang.annotation.Retention;
45import java.lang.annotation.RetentionPolicy;
46
47/**
48 * A primary toolbar within the activity that may display the activity title, application-level
49 * navigation affordances, and other interactive items.
50 *
51 * <p>The action bar appears at the top of an activity's window when the activity uses the
52 * AppCompat's {@link R.style#Theme_AppCompat AppCompat} theme (or one of its descendant themes).
53 * You may otherwise add the action bar by calling {@link
54 * AppCompatDelegate#requestWindowFeature(int)  requestFeature(FEATURE_SUPPORT_ACTION_BAR)} or by
55 * declaring it in a custom theme with the
56 * {@link R.styleable#AppCompatTheme_windowActionBar windowActionBar} property.</p>
57 *
58 * <p>The action bar may be represented by any Toolbar widget within the application layout.
59 * The application may signal to the Activity which Toolbar should be treated as the Activity's
60 * action bar. Activities that use this feature should use one of the supplied
61 * <code>.NoActionBar</code> themes, set the
62 * {@link R.styleable#AppCompatTheme_windowActionBar windowActionBar} attribute to
63 * <code>false</code> or otherwise not request the window feature.</p>
64 *
65 * <p>If your activity has an options menu, you can make select items accessible directly from the
66 * action bar as "action items". You can also  modify various characteristics of the action bar or
67 * remove it completely.</p>
68 *
69 * <p>The navigation button (formerly "Home") takes over the space previously occupied by the
70 * application icon. Apps wishing to express a stronger branding should use their brand colors
71 * heavily in the action bar and other application chrome or use a {@link #setLogo(int) logo}
72 * in place of their standard title text.</p>
73 *
74 * <p>From your activity, you can retrieve an instance of {@link ActionBar} by calling {@link
75 * AppCompatActivity#getSupportActionBar()}  getSupportActionBar()}.</p>
76 *
77 * <p>In some cases, the action bar may be overlayed by another bar that enables contextual actions,
78 * using an {@link ActionMode}. For example, when the user selects one or more items in
79 * your activity, you can enable an action mode that offers actions specific to the selected
80 * items, with a UI that temporarily replaces the action bar. Although the UI may occupy the
81 * same space, the {@link ActionMode} APIs are distinct and independent from those for
82 * {@link ActionBar}.</p>
83 *
84 * <div class="special reference">
85 * <h3>Developer Guides</h3>
86 * <p>For information about how to use the action bar, including how to add action items, navigation
87 * modes and more, read the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action
88 * Bar</a> developer guide.</p>
89 * </div>
90 */
91public abstract class ActionBar {
92
93    /** @hide */
94    @RestrictTo(LIBRARY_GROUP)
95    @Retention(RetentionPolicy.SOURCE)
96    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
97    public @interface NavigationMode {}
98
99    /**
100     * Standard navigation mode. Consists of either a logo or icon
101     * and title text with an optional subtitle. Clicking any of these elements
102     * will dispatch onOptionsItemSelected to the host Activity with
103     * a MenuItem with item ID android.R.id.home.
104     *
105     * @deprecated Action bar navigation modes are deprecated and not supported by inline
106     * toolbar action bars. Consider using other
107     * <a href="http://developer.android.com/design/patterns/navigation.html">common
108     * navigation patterns</a> instead.
109     */
110    @Deprecated
111    public static final int NAVIGATION_MODE_STANDARD = 0;
112
113    /**
114     * List navigation mode. Instead of static title text this mode
115     * presents a list menu for navigation within the activity.
116     * e.g. this might be presented to the user as a dropdown list.
117     *
118     * @deprecated Action bar navigation modes are deprecated and not supported by inline
119     * toolbar action bars. Consider using other
120     * <a href="http://developer.android.com/design/patterns/navigation.html">common
121     * navigation patterns</a> instead.
122     */
123    @Deprecated
124    public static final int NAVIGATION_MODE_LIST = 1;
125
126    /**
127     * Tab navigation mode. Instead of static title text this mode
128     * presents a series of tabs for navigation within the activity.
129     *
130     * @deprecated Action bar navigation modes are deprecated and not supported by inline
131     * toolbar action bars. Consider using other
132     * <a href="http://developer.android.com/design/patterns/navigation.html">common
133     * navigation patterns</a> instead.
134     */
135    @Deprecated
136    public static final int NAVIGATION_MODE_TABS = 2;
137
138    /** @hide */
139    @RestrictTo(LIBRARY_GROUP)
140    @IntDef(flag=true, value={
141            DISPLAY_USE_LOGO,
142            DISPLAY_SHOW_HOME,
143            DISPLAY_HOME_AS_UP,
144            DISPLAY_SHOW_TITLE,
145            DISPLAY_SHOW_CUSTOM
146    })
147    @Retention(RetentionPolicy.SOURCE)
148    public @interface DisplayOptions {}
149
150    /**
151     * Use logo instead of icon if available. This flag will cause appropriate
152     * navigation modes to use a wider logo in place of the standard icon.
153     *
154     * @see #setDisplayOptions(int)
155     * @see #setDisplayOptions(int, int)
156     */
157    public static final int DISPLAY_USE_LOGO = 0x1;
158
159    /**
160     * Show 'home' elements in this action bar, leaving more space for other
161     * navigation elements. This includes logo and icon.
162     *
163     * @see #setDisplayOptions(int)
164     * @see #setDisplayOptions(int, int)
165     */
166    public static final int DISPLAY_SHOW_HOME = 0x2;
167
168    /**
169     * Display the 'home' element such that it appears as an 'up' affordance.
170     * e.g. show an arrow to the left indicating the action that will be taken.
171     *
172     * Set this flag if selecting the 'home' button in the action bar to return
173     * up by a single level in your UI rather than back to the top level or front page.
174     *
175     * <p>Setting this option will implicitly enable interaction with the home/up
176     * button. See {@link #setHomeButtonEnabled(boolean)}.
177     *
178     * @see #setDisplayOptions(int)
179     * @see #setDisplayOptions(int, int)
180     */
181    public static final int DISPLAY_HOME_AS_UP = 0x4;
182
183    /**
184     * Show the activity title and subtitle, if present.
185     *
186     * @see #setTitle(CharSequence)
187     * @see #setTitle(int)
188     * @see #setSubtitle(CharSequence)
189     * @see #setSubtitle(int)
190     * @see #setDisplayOptions(int)
191     * @see #setDisplayOptions(int, int)
192     */
193    public static final int DISPLAY_SHOW_TITLE = 0x8;
194
195    /**
196     * Show the custom view if one has been set.
197     *
198     * @see #setCustomView(View)
199     * @see #setDisplayOptions(int)
200     * @see #setDisplayOptions(int, int)
201     */
202    public static final int DISPLAY_SHOW_CUSTOM = 0x10;
203
204    /**
205     * Set the action bar into custom navigation mode, supplying a view
206     * for custom navigation.
207     *
208     * Custom navigation views appear between the application icon and
209     * any action buttons and may use any space available there. Common
210     * use cases for custom navigation views might include an auto-suggesting
211     * address bar for a browser or other navigation mechanisms that do not
212     * translate well to provided navigation modes.
213     *
214     * @param view Custom navigation view to place in the ActionBar.
215     */
216    public abstract void setCustomView(View view);
217
218    /**
219     * Set the action bar into custom navigation mode, supplying a view
220     * for custom navigation.
221     *
222     * <p>Custom navigation views appear between the application icon and
223     * any action buttons and may use any space available there. Common
224     * use cases for custom navigation views might include an auto-suggesting
225     * address bar for a browser or other navigation mechanisms that do not
226     * translate well to provided navigation modes.</p>
227     *
228     * <p>The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for
229     * the custom view to be displayed.</p>
230     *
231     * @param view Custom navigation view to place in the ActionBar.
232     * @param layoutParams How this custom view should layout in the bar.
233     *
234     * @see #setDisplayOptions(int, int)
235     */
236    public abstract void setCustomView(View view, LayoutParams layoutParams);
237
238    /**
239     * Set the action bar into custom navigation mode, supplying a view
240     * for custom navigation.
241     *
242     * <p>Custom navigation views appear between the application icon and
243     * any action buttons and may use any space available there. Common
244     * use cases for custom navigation views might include an auto-suggesting
245     * address bar for a browser or other navigation mechanisms that do not
246     * translate well to provided navigation modes.</p>
247     *
248     * <p>The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for
249     * the custom view to be displayed.</p>
250     *
251     * @param resId Resource ID of a layout to inflate into the ActionBar.
252     *
253     * @see #setDisplayOptions(int, int)
254     */
255    public abstract void setCustomView(int resId);
256
257    /**
258     * Set the icon to display in the 'home' section of the action bar.
259     * The action bar will use an icon specified by its style or the
260     * activity icon by default.
261     *
262     * Whether the home section shows an icon or logo is controlled
263     * by the display option {@link #DISPLAY_USE_LOGO}.
264     *
265     * @param resId Resource ID of a drawable to show as an icon.
266     *
267     * @see #setDisplayUseLogoEnabled(boolean)
268     * @see #setDisplayShowHomeEnabled(boolean)
269     */
270    public abstract void setIcon(@DrawableRes int resId);
271
272    /**
273     * Set the icon to display in the 'home' section of the action bar.
274     * The action bar will use an icon specified by its style or the
275     * activity icon by default.
276     *
277     * Whether the home section shows an icon or logo is controlled
278     * by the display option {@link #DISPLAY_USE_LOGO}.
279     *
280     * @param icon Drawable to show as an icon.
281     *
282     * @see #setDisplayUseLogoEnabled(boolean)
283     * @see #setDisplayShowHomeEnabled(boolean)
284     */
285    public abstract void setIcon(Drawable icon);
286
287    /**
288     * Set the logo to display in the 'home' section of the action bar.
289     * The action bar will use a logo specified by its style or the
290     * activity logo by default.
291     *
292     * Whether the home section shows an icon or logo is controlled
293     * by the display option {@link #DISPLAY_USE_LOGO}.
294     *
295     * @param resId Resource ID of a drawable to show as a logo.
296     *
297     * @see #setDisplayUseLogoEnabled(boolean)
298     * @see #setDisplayShowHomeEnabled(boolean)
299     */
300    public abstract void setLogo(@DrawableRes int resId);
301
302    /**
303     * Set the logo to display in the 'home' section of the action bar.
304     * The action bar will use a logo specified by its style or the
305     * activity logo by default.
306     *
307     * Whether the home section shows an icon or logo is controlled
308     * by the display option {@link #DISPLAY_USE_LOGO}.
309     *
310     * @param logo Drawable to show as a logo.
311     *
312     * @see #setDisplayUseLogoEnabled(boolean)
313     * @see #setDisplayShowHomeEnabled(boolean)
314     */
315    public abstract void setLogo(Drawable logo);
316
317    /**
318     * Set the adapter and navigation callback for list navigation mode.
319     *
320     * The supplied adapter will provide views for the expanded list as well as
321     * the currently selected item. (These may be displayed differently.)
322     *
323     * The supplied OnNavigationListener will alert the application when the user
324     * changes the current list selection.
325     *
326     * @param adapter An adapter that will provide views both to display
327     *                the current navigation selection and populate views
328     *                within the dropdown navigation menu.
329     * @param callback An OnNavigationListener that will receive events when the user
330     *                 selects a navigation item.
331     *
332     * @deprecated Action bar navigation modes are deprecated and not supported by inline
333     * toolbar action bars. Consider using other
334     * <a href="http://developer.android.com/design/patterns/navigation.html">common
335     * navigation patterns</a> instead.
336     */
337    @Deprecated
338    public abstract void setListNavigationCallbacks(SpinnerAdapter adapter,
339            OnNavigationListener callback);
340
341    /**
342     * Set the selected navigation item in list or tabbed navigation modes.
343     *
344     * @param position Position of the item to select.
345     *
346     * @deprecated Action bar navigation modes are deprecated and not supported by inline
347     * toolbar action bars. Consider using other
348     * <a href="http://developer.android.com/design/patterns/navigation.html">common
349     * navigation patterns</a> instead.
350     */
351    @Deprecated
352    public abstract void setSelectedNavigationItem(int position);
353
354    /**
355     * Get the position of the selected navigation item in list or tabbed navigation modes.
356     *
357     * @return Position of the selected item.
358     *
359     * @deprecated Action bar navigation modes are deprecated and not supported by inline
360     * toolbar action bars. Consider using other
361     * <a href="http://developer.android.com/design/patterns/navigation.html">common
362     * navigation patterns</a> instead.
363     */
364    @Deprecated
365    public abstract int getSelectedNavigationIndex();
366
367    /**
368     * Get the number of navigation items present in the current navigation mode.
369     *
370     * @return Number of navigation items.
371     *
372     * @deprecated Action bar navigation modes are deprecated and not supported by inline
373     * toolbar action bars. Consider using other
374     * <a href="http://developer.android.com/design/patterns/navigation.html">common
375     * navigation patterns</a> instead.
376     */
377    @Deprecated
378    public abstract int getNavigationItemCount();
379
380    /**
381     * Set the action bar's title. This will only be displayed if
382     * {@link #DISPLAY_SHOW_TITLE} is set.
383     *
384     * @param title Title to set
385     *
386     * @see #setTitle(int)
387     * @see #setDisplayOptions(int, int)
388     */
389    public abstract void setTitle(CharSequence title);
390
391    /**
392     * Set the action bar's title. This will only be displayed if
393     * {@link #DISPLAY_SHOW_TITLE} is set.
394     *
395     * @param resId Resource ID of title string to set
396     *
397     * @see #setTitle(CharSequence)
398     * @see #setDisplayOptions(int, int)
399     */
400    public abstract void setTitle(@StringRes int resId);
401
402    /**
403     * Set the action bar's subtitle. This will only be displayed if
404     * {@link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the
405     * subtitle entirely.
406     *
407     * @param subtitle Subtitle to set
408     *
409     * @see #setSubtitle(int)
410     * @see #setDisplayOptions(int, int)
411     */
412    public abstract void setSubtitle(CharSequence subtitle);
413
414    /**
415     * Set the action bar's subtitle. This will only be displayed if
416     * {@link #DISPLAY_SHOW_TITLE} is set.
417     *
418     * @param resId Resource ID of subtitle string to set
419     *
420     * @see #setSubtitle(CharSequence)
421     * @see #setDisplayOptions(int, int)
422     */
423    public abstract void setSubtitle(int resId);
424
425    /**
426     * Set display options. This changes all display option bits at once. To change
427     * a limited subset of display options, see {@link #setDisplayOptions(int, int)}.
428     *
429     * @param options A combination of the bits defined by the DISPLAY_ constants
430     *                defined in ActionBar.
431     */
432    public abstract void setDisplayOptions(@DisplayOptions int options);
433
434    /**
435     * Set selected display options. Only the options specified by mask will be changed.
436     * To change all display option bits at once, see {@link #setDisplayOptions(int)}.
437     *
438     * <p>Example: setDisplayOptions(0, DISPLAY_SHOW_HOME) will disable the
439     * {@link #DISPLAY_SHOW_HOME} option.
440     * setDisplayOptions(DISPLAY_SHOW_HOME, DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO)
441     * will enable {@link #DISPLAY_SHOW_HOME} and disable {@link #DISPLAY_USE_LOGO}.
442     *
443     * @param options A combination of the bits defined by the DISPLAY_ constants
444     *                defined in ActionBar.
445     * @param mask A bit mask declaring which display options should be changed.
446     */
447    public abstract void setDisplayOptions(@DisplayOptions int options, @DisplayOptions int mask);
448
449    /**
450     * Set whether to display the activity logo rather than the activity icon.
451     * A logo is often a wider, more detailed image.
452     *
453     * <p>To set several display options at once, see the setDisplayOptions methods.
454     *
455     * @param useLogo true to use the activity logo, false to use the activity icon.
456     *
457     * @see #setDisplayOptions(int)
458     * @see #setDisplayOptions(int, int)
459     */
460    public abstract void setDisplayUseLogoEnabled(boolean useLogo);
461
462    /**
463     * Set whether to include the application home affordance in the action bar.
464     * Home is presented as either an activity icon or logo.
465     *
466     * <p>To set several display options at once, see the setDisplayOptions methods.
467     *
468     * @param showHome true to show home, false otherwise.
469     *
470     * @see #setDisplayOptions(int)
471     * @see #setDisplayOptions(int, int)
472     */
473    public abstract void setDisplayShowHomeEnabled(boolean showHome);
474
475    /**
476     * Set whether home should be displayed as an "up" affordance.
477     * Set this to true if selecting "home" returns up by a single level in your UI
478     * rather than back to the top level or front page.
479     *
480     * <p>To set several display options at once, see the setDisplayOptions methods.
481     *
482     * @param showHomeAsUp true to show the user that selecting home will return one
483     *                     level up rather than to the top level of the app.
484     *
485     * @see #setDisplayOptions(int)
486     * @see #setDisplayOptions(int, int)
487     */
488    public abstract void setDisplayHomeAsUpEnabled(boolean showHomeAsUp);
489
490    /**
491     * Set whether an activity title/subtitle should be displayed.
492     *
493     * <p>To set several display options at once, see the setDisplayOptions methods.
494     *
495     * @param showTitle true to display a title/subtitle if present.
496     * @see #setDisplayOptions(int)
497     * @see #setDisplayOptions(int, int)
498     */
499    public abstract void setDisplayShowTitleEnabled(boolean showTitle);
500
501    /**
502     * Set whether a custom view should be displayed, if set.
503     *
504     * <p>To set several display options at once, see the setDisplayOptions methods.
505     *
506     * @param showCustom true if the currently set custom view should be displayed, false otherwise.
507     *
508     * @see #setDisplayOptions(int)
509     * @see #setDisplayOptions(int, int)
510     */
511    public abstract void setDisplayShowCustomEnabled(boolean showCustom);
512
513    /**
514     * Set the ActionBar's background. This will be used for the primary
515     * action bar.
516     *
517     * @param d Background drawable
518     * @see #setStackedBackgroundDrawable(Drawable)
519     * @see #setSplitBackgroundDrawable(Drawable)
520     */
521    public abstract void setBackgroundDrawable(@Nullable Drawable d);
522
523    /**
524     * Set the ActionBar's stacked background. This will appear
525     * in the second row/stacked bar on some devices and configurations.
526     *
527     * @param d Background drawable for the stacked row
528     */
529    public void setStackedBackgroundDrawable(Drawable d) { }
530
531    /**
532     * Set the ActionBar's split background. This will appear in
533     * the split action bar containing menu-provided action buttons
534     * on some devices and configurations.
535     * <p>You can enable split action bar with {@link android.R.attr#uiOptions}
536     *
537     * @param d Background drawable for the split bar
538     */
539    public void setSplitBackgroundDrawable(Drawable d) { }
540
541    /**
542     * @return The current custom view.
543     */
544    public abstract View getCustomView();
545
546    /**
547     * Returns the current ActionBar title in standard mode.
548     * Returns null if {@link #getNavigationMode()} would not return
549     * {@link #NAVIGATION_MODE_STANDARD}.
550     *
551     * @return The current ActionBar title or null.
552     */
553    @Nullable
554    public abstract CharSequence getTitle();
555
556    /**
557     * Returns the current ActionBar subtitle in standard mode.
558     * Returns null if {@link #getNavigationMode()} would not return
559     * {@link #NAVIGATION_MODE_STANDARD}.
560     *
561     * @return The current ActionBar subtitle or null.
562     */
563    @Nullable
564    public abstract CharSequence getSubtitle();
565
566    /**
567     * Returns the current navigation mode. The result will be one of:
568     * <ul>
569     * <li>{@link #NAVIGATION_MODE_STANDARD}</li>
570     * <li>{@link #NAVIGATION_MODE_LIST}</li>
571     * <li>{@link #NAVIGATION_MODE_TABS}</li>
572     * </ul>
573     *
574     * @return The current navigation mode.
575     *
576     * @deprecated Action bar navigation modes are deprecated and not supported by inline
577     * toolbar action bars. Consider using other
578     * <a href="http://developer.android.com/design/patterns/navigation.html">common
579     * navigation patterns</a> instead.
580     */
581    @Deprecated
582    @NavigationMode
583    public abstract int getNavigationMode();
584
585    /**
586     * Set the current navigation mode.
587     *
588     * @param mode The new mode to set.
589     * @see #NAVIGATION_MODE_STANDARD
590     * @see #NAVIGATION_MODE_LIST
591     * @see #NAVIGATION_MODE_TABS
592     *
593     * @deprecated Action bar navigation modes are deprecated and not supported by inline
594     * toolbar action bars. Consider using other
595     * <a href="http://developer.android.com/design/patterns/navigation.html">common
596     * navigation patterns</a> instead.
597     */
598    @Deprecated
599    public abstract void setNavigationMode(@NavigationMode int mode);
600
601    /**
602     * @return The current set of display options.
603     */
604    @DisplayOptions
605    public abstract int getDisplayOptions();
606
607    /**
608     * Create and return a new {@link Tab}.
609     * This tab will not be included in the action bar until it is added.
610     *
611     * @return A new Tab
612     *
613     * @see #addTab(Tab)
614     *
615     * @deprecated Action bar navigation modes are deprecated and not supported by inline
616     * toolbar action bars. Consider using other
617     * <a href="http://developer.android.com/design/patterns/navigation.html">common
618     * navigation patterns</a> instead.
619     */
620    @Deprecated
621    public abstract Tab newTab();
622
623    /**
624     * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list.
625     * If this is the first tab to be added it will become the selected tab.
626     *
627     * @param tab Tab to add
628     *
629     * @deprecated Action bar navigation modes are deprecated and not supported by inline
630     * toolbar action bars. Consider using other
631     * <a href="http://developer.android.com/design/patterns/navigation.html">common
632     * navigation patterns</a> instead.
633     */
634    @Deprecated
635    public abstract void addTab(Tab tab);
636
637    /**
638     * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list.
639     *
640     * @param tab Tab to add
641     * @param setSelected True if the added tab should become the selected tab.
642     *
643     * @deprecated Action bar navigation modes are deprecated and not supported by inline
644     * toolbar action bars. Consider using other
645     * <a href="http://developer.android.com/design/patterns/navigation.html">common
646     * navigation patterns</a> instead.
647     */
648    @Deprecated
649    public abstract void addTab(Tab tab, boolean setSelected);
650
651    /**
652     * Add a tab for use in tabbed navigation mode. The tab will be inserted at
653     * <code>position</code>. If this is the first tab to be added it will become
654     * the selected tab.
655     *
656     * @param tab The tab to add
657     * @param position The new position of the tab
658     *
659     * @deprecated Action bar navigation modes are deprecated and not supported by inline
660     * toolbar action bars. Consider using other
661     * <a href="http://developer.android.com/design/patterns/navigation.html">common
662     * navigation patterns</a> instead.
663     */
664    @Deprecated
665    public abstract void addTab(Tab tab, int position);
666
667    /**
668     * Add a tab for use in tabbed navigation mode. The tab will be inserted at
669     * <code>position</code>.
670     *
671     * @param tab The tab to add
672     * @param position The new position of the tab
673     * @param setSelected True if the added tab should become the selected tab.
674     *
675     * @deprecated Action bar navigation modes are deprecated and not supported by inline
676     * toolbar action bars. Consider using other
677     * <a href="http://developer.android.com/design/patterns/navigation.html">common
678     * navigation patterns</a> instead.
679     */
680    @Deprecated
681    public abstract void addTab(Tab tab, int position, boolean setSelected);
682
683    /**
684     * Remove a tab from the action bar. If the removed tab was selected it will be deselected
685     * and another tab will be selected if present.
686     *
687     * @param tab The tab to remove
688     *
689     * @deprecated Action bar navigation modes are deprecated and not supported by inline
690     * toolbar action bars. Consider using other
691     * <a href="http://developer.android.com/design/patterns/navigation.html">common
692     * navigation patterns</a> instead.
693     */
694    @Deprecated
695    public abstract void removeTab(Tab tab);
696
697    /**
698     * Remove a tab from the action bar. If the removed tab was selected it will be deselected
699     * and another tab will be selected if present.
700     *
701     * @param position Position of the tab to remove
702     *
703     * @deprecated Action bar navigation modes are deprecated and not supported by inline
704     * toolbar action bars. Consider using other
705     * <a href="http://developer.android.com/design/patterns/navigation.html">common
706     * navigation patterns</a> instead.
707     */
708    @Deprecated
709    public abstract void removeTabAt(int position);
710
711    /**
712     * Remove all tabs from the action bar and deselect the current tab.
713     *
714     * @deprecated Action bar navigation modes are deprecated and not supported by inline
715     * toolbar action bars. Consider using other
716     * <a href="http://developer.android.com/design/patterns/navigation.html">common
717     * navigation patterns</a> instead.
718     */
719    @Deprecated
720    public abstract void removeAllTabs();
721
722    /**
723     * Select the specified tab. If it is not a child of this action bar it will be added.
724     *
725     * <p>Note: If you want to select by index, use {@link #setSelectedNavigationItem(int)}.</p>
726     *
727     * @param tab Tab to select
728     *
729     * @deprecated Action bar navigation modes are deprecated and not supported by inline
730     * toolbar action bars. Consider using other
731     * <a href="http://developer.android.com/design/patterns/navigation.html">common
732     * navigation patterns</a> instead.
733     */
734    @Deprecated
735    public abstract void selectTab(Tab tab);
736
737    /**
738     * Returns the currently selected tab if in tabbed navigation mode and there is at least
739     * one tab present.
740     *
741     * @return The currently selected tab or null
742     *
743     * @deprecated Action bar navigation modes are deprecated and not supported by inline
744     * toolbar action bars. Consider using other
745     * <a href="http://developer.android.com/design/patterns/navigation.html">common
746     * navigation patterns</a> instead.
747     */
748    @Deprecated
749    @Nullable
750    public abstract Tab getSelectedTab();
751
752    /**
753     * Returns the tab at the specified index.
754     *
755     * @param index Index value in the range 0-get
756     * @return
757     *
758     * @deprecated Action bar navigation modes are deprecated and not supported by inline
759     * toolbar action bars. Consider using other
760     * <a href="http://developer.android.com/design/patterns/navigation.html">common
761     * navigation patterns</a> instead.
762     */
763    @Deprecated
764    public abstract Tab getTabAt(int index);
765
766    /**
767     * Returns the number of tabs currently registered with the action bar.
768     *
769     * @return Tab count
770     *
771     * @deprecated Action bar navigation modes are deprecated and not supported by inline
772     * toolbar action bars. Consider using other
773     * <a href="http://developer.android.com/design/patterns/navigation.html">common
774     * navigation patterns</a> instead.
775     */
776    @Deprecated
777    public abstract int getTabCount();
778
779    /**
780     * Retrieve the current height of the ActionBar.
781     *
782     * @return The ActionBar's height
783     */
784    public abstract int getHeight();
785
786    /**
787     * Show the ActionBar if it is not currently showing.
788     * If the window hosting the ActionBar does not have the feature
789     * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application
790     * content to fit the new space available.
791     *
792     * <p>If you are hiding the ActionBar through
793     * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN},
794     * you should not call this function directly.
795     */
796    public abstract void show();
797
798    /**
799     * Hide the ActionBar if it is currently showing.
800     * If the window hosting the ActionBar does not have the feature
801     * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application
802     * content to fit the new space available.
803     *
804     * <p>Instead of calling this function directly, you can also cause an
805     * ActionBar using the overlay feature to hide through
806     * {@link View#SYSTEM_UI_FLAG_FULLSCREEN View.SYSTEM_UI_FLAG_FULLSCREEN}.
807     * Hiding the ActionBar through this system UI flag allows you to more
808     * seamlessly hide it in conjunction with other screen decorations.
809     */
810    public abstract void hide();
811
812    /**
813     * @return <code>true</code> if the ActionBar is showing, <code>false</code> otherwise.
814     */
815    public abstract boolean isShowing();
816
817    /**
818     * Add a listener that will respond to menu visibility change events.
819     *
820     * @param listener The new listener to add
821     */
822    public abstract void addOnMenuVisibilityListener(OnMenuVisibilityListener listener);
823
824    /**
825     * Remove a menu visibility listener. This listener will no longer receive menu
826     * visibility change events.
827     *
828     * @param listener A listener to remove that was previously added
829     */
830    public abstract void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener);
831
832    /**
833     * Enable or disable the "home" button in the corner of the action bar. (Note that this
834     * is the application home/up affordance on the action bar, not the system wide home
835     * button.)
836     *
837     * <p>This defaults to true for packages targeting &lt; API 14. For packages targeting
838     * API 14 or greater, the application should call this method to enable interaction
839     * with the home/up affordance.
840     *
841     * <p>Setting the {@link #DISPLAY_HOME_AS_UP} display option will automatically enable
842     * the home button.
843     *
844     * @param enabled true to enable the home button, false to disable the home button.
845     */
846    public void setHomeButtonEnabled(boolean enabled) { }
847
848    /**
849     * Returns a {@link Context} with an appropriate theme for creating views that
850     * will appear in the action bar. If you are inflating or instantiating custom views
851     * that will appear in an action bar, you should use the Context returned by this method.
852     * (This includes adapters used for list navigation mode.)
853     * This will ensure that views contrast properly against the action bar.
854     *
855     * @return A themed Context for creating views
856     */
857    public Context getThemedContext() {
858        return null;
859    }
860
861    /**
862     * Returns true if the Title field has been truncated during layout for lack
863     * of available space.
864     *
865     * @return true if the Title field has been truncated
866     * @hide pending API approval
867     */
868    @RestrictTo(LIBRARY_GROUP)
869    public boolean isTitleTruncated() { return false; }
870
871    /**
872     * Set an alternate drawable to display next to the icon/logo/title
873     * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using
874     * this mode to display an alternate selection for up navigation, such as a sliding drawer.
875     *
876     * <p>If you pass <code>null</code> to this method, the default drawable from the theme
877     * will be used.</p>
878     *
879     * <p>If you implement alternate or intermediate behavior around Up, you should also
880     * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()}
881     * to provide a correct description of the action for accessibility support.</p>
882     *
883     * @param indicator A drawable to use for the up indicator, or null to use the theme's default
884     *
885     * @see #setDisplayOptions(int, int)
886     * @see #setDisplayHomeAsUpEnabled(boolean)
887     * @see #setHomeActionContentDescription(int)
888     */
889    public void setHomeAsUpIndicator(@Nullable Drawable indicator) {}
890
891    /**
892     * Set an alternate drawable to display next to the icon/logo/title
893     * when {@link #DISPLAY_HOME_AS_UP} is enabled. This can be useful if you are using
894     * this mode to display an alternate selection for up navigation, such as a sliding drawer.
895     *
896     * <p>If you pass <code>0</code> to this method, the default drawable from the theme
897     * will be used.</p>
898     *
899     * <p>If you implement alternate or intermediate behavior around Up, you should also
900     * call {@link #setHomeActionContentDescription(int) setHomeActionContentDescription()}
901     * to provide a correct description of the action for accessibility support.</p>
902     *
903     * @param resId Resource ID of a drawable to use for the up indicator, or null
904     *              to use the theme's default
905     *
906     * @see #setDisplayOptions(int, int)
907     * @see #setDisplayHomeAsUpEnabled(boolean)
908     * @see #setHomeActionContentDescription(int)
909     */
910    public void setHomeAsUpIndicator(@DrawableRes int resId) {}
911
912    /**
913     * Set an alternate description for the Home/Up action, when enabled.
914     *
915     * <p>This description is commonly used for accessibility/screen readers when
916     * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.)
917     * Examples of this are, "Navigate Home" or "Navigate Up" depending on the
918     * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up
919     * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific
920     * functionality such as a sliding drawer, you should also set this to accurately
921     * describe the action.</p>
922     *
923     * <p>Setting this to <code>null</code> will use the system default description.</p>
924     *
925     * @param description New description for the Home action when enabled
926     * @see #setHomeAsUpIndicator(int)
927     * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable)
928     */
929    public void setHomeActionContentDescription(@Nullable CharSequence description) {}
930
931    /**
932     * Set an alternate description for the Home/Up action, when enabled.
933     *
934     * <p>This description is commonly used for accessibility/screen readers when
935     * the Home action is enabled. (See {@link #setDisplayHomeAsUpEnabled(boolean)}.)
936     * Examples of this are, "Navigate Home" or "Navigate Up" depending on the
937     * {@link #DISPLAY_HOME_AS_UP} display option. If you have changed the home-as-up
938     * indicator using {@link #setHomeAsUpIndicator(int)} to indicate more specific
939     * functionality such as a sliding drawer, you should also set this to accurately
940     * describe the action.</p>
941     *
942     * <p>Setting this to <code>0</code> will use the system default description.</p>
943     *
944     * @param resId Resource ID of a string to use as the new description
945     *              for the Home action when enabled
946     * @see #setHomeAsUpIndicator(int)
947     * @see #setHomeAsUpIndicator(android.graphics.drawable.Drawable)
948     */
949    public void setHomeActionContentDescription(@StringRes int resId) {}
950
951    /**
952     * Enable hiding the action bar on content scroll.
953     *
954     * <p>If enabled, the action bar will scroll out of sight along with a
955     * {@link View#setNestedScrollingEnabled(boolean) nested scrolling child} view's content.
956     * The action bar must be in {@link Window#FEATURE_ACTION_BAR_OVERLAY overlay mode}
957     * to enable hiding on content scroll.</p>
958     *
959     * <p>When partially scrolled off screen the action bar is considered
960     * {@link #hide() hidden}. A call to {@link #show() show} will cause it to return to full view.
961     * </p>
962     * @param hideOnContentScroll true to enable hiding on content scroll.
963     */
964    public void setHideOnContentScrollEnabled(boolean hideOnContentScroll) {
965        if (hideOnContentScroll) {
966            throw new UnsupportedOperationException("Hide on content scroll is not supported in " +
967                    "this action bar configuration.");
968        }
969    }
970
971    /**
972     * Return whether the action bar is configured to scroll out of sight along with
973     * a {@link View#setNestedScrollingEnabled(boolean) nested scrolling child}.
974     *
975     * @return true if hide-on-content-scroll is enabled
976     * @see #setHideOnContentScrollEnabled(boolean)
977     */
978    public boolean isHideOnContentScrollEnabled() {
979        return false;
980    }
981
982    /**
983     * Return the current vertical offset of the action bar.
984     *
985     * <p>The action bar's current hide offset is the distance that the action bar is currently
986     * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's
987     * current measured {@link #getHeight() height} (fully invisible).</p>
988     *
989     * @return The action bar's offset toward its fully hidden state in pixels
990     */
991    public int getHideOffset() {
992        return 0;
993    }
994
995    /**
996     * Set the current hide offset of the action bar.
997     *
998     * <p>The action bar's current hide offset is the distance that the action bar is currently
999     * scrolled offscreen in pixels. The valid range is 0 (fully visible) to the action bar's
1000     * current measured {@link #getHeight() height} (fully invisible).</p>
1001     *
1002     * @param offset The action bar's offset toward its fully hidden state in pixels.
1003     */
1004    public void setHideOffset(int offset) {
1005        if (offset != 0) {
1006            throw new UnsupportedOperationException("Setting an explicit action bar hide offset " +
1007                    "is not supported in this action bar configuration.");
1008        }
1009    }
1010
1011    /**
1012     * Set the Z-axis elevation of the action bar in pixels.
1013     *
1014     * <p>The action bar's elevation is the distance it is placed from its parent surface. Higher
1015     * values are closer to the user.</p>
1016     *
1017     * @param elevation Elevation value in pixels
1018     */
1019    public void setElevation(float elevation) {
1020        if (elevation != 0) {
1021            throw new UnsupportedOperationException("Setting a non-zero elevation is " +
1022                    "not supported in this action bar configuration.");
1023        }
1024    }
1025
1026    /**
1027     * Get the Z-axis elevation of the action bar in pixels.
1028     *
1029     * <p>The action bar's elevation is the distance it is placed from its parent surface. Higher
1030     * values are closer to the user.</p>
1031     *
1032     * @return Elevation value in pixels
1033     */
1034    public float getElevation() {
1035        return 0;
1036    }
1037
1038    /** @hide */
1039    @RestrictTo(LIBRARY_GROUP)
1040    public void setDefaultDisplayHomeAsUpEnabled(boolean enabled) {
1041    }
1042
1043    /** @hide */
1044    @RestrictTo(LIBRARY_GROUP)
1045    public void setShowHideAnimationEnabled(boolean enabled) {
1046    }
1047
1048    /** @hide */
1049    @RestrictTo(LIBRARY_GROUP)
1050    public void onConfigurationChanged(Configuration config) {
1051    }
1052
1053    /** @hide */
1054    @RestrictTo(LIBRARY_GROUP)
1055    public void dispatchMenuVisibilityChanged(boolean visible) {
1056    }
1057
1058    /** @hide */
1059    @RestrictTo(LIBRARY_GROUP)
1060    public ActionMode startActionMode(ActionMode.Callback callback) {
1061        return null;
1062    }
1063
1064    /** @hide */
1065    @RestrictTo(LIBRARY_GROUP)
1066    public boolean openOptionsMenu() {
1067        return false;
1068    }
1069
1070    /** @hide */
1071    @RestrictTo(LIBRARY_GROUP)
1072    public boolean closeOptionsMenu() {
1073        return false;
1074    }
1075
1076    /** @hide */
1077    @RestrictTo(LIBRARY_GROUP)
1078    public boolean invalidateOptionsMenu() {
1079        return false;
1080    }
1081
1082    /** @hide */
1083    @RestrictTo(LIBRARY_GROUP)
1084    public boolean onMenuKeyEvent(KeyEvent event) {
1085        return false;
1086    }
1087
1088    /** @hide **/
1089    @RestrictTo(LIBRARY_GROUP)
1090    public boolean onKeyShortcut(int keyCode, KeyEvent ev) {
1091        return false;
1092    }
1093
1094    /** @hide */
1095    @RestrictTo(LIBRARY_GROUP)
1096    public boolean collapseActionView() {
1097        return false;
1098    }
1099
1100    /** @hide */
1101    @RestrictTo(LIBRARY_GROUP)
1102    public void setWindowTitle(CharSequence title) {
1103    }
1104
1105    /**
1106     * Attempts to move focus to the ActionBar if it does not already contain the focus.
1107     *
1108     * @return {@code true} if focus changes or {@code false} if focus doesn't change.
1109     * @hide
1110     */
1111    @RestrictTo(LIBRARY_GROUP)
1112    boolean requestFocus() {
1113        return false;
1114    }
1115
1116    /**
1117     * Clean up any resources
1118     */
1119    void onDestroy() {
1120    }
1121
1122    /**
1123     * Listener interface for ActionBar navigation events.
1124     *
1125     * @deprecated Action bar navigation modes are deprecated and not supported by inline
1126     * toolbar action bars. Consider using other
1127     * <a href="http://developer.android.com/design/patterns/navigation.html">common
1128     * navigation patterns</a> instead.
1129     */
1130    @Deprecated
1131    public interface OnNavigationListener {
1132        /**
1133         * This method is called whenever a navigation item in your action bar
1134         * is selected.
1135         *
1136         * @param itemPosition Position of the item clicked.
1137         * @param itemId ID of the item clicked.
1138         * @return True if the event was handled, false otherwise.
1139         */
1140        public boolean onNavigationItemSelected(int itemPosition, long itemId);
1141    }
1142
1143    /**
1144     * Listener for receiving events when action bar menus are shown or hidden.
1145     */
1146    public interface OnMenuVisibilityListener {
1147
1148        /**
1149         * Called when an action bar menu is shown or hidden. Applications may want to use
1150         * this to tune auto-hiding behavior for the action bar or pause/resume video playback,
1151         * gameplay, or other activity within the main content area.
1152         *
1153         * @param isVisible True if an action bar menu is now visible, false if no action bar
1154         *                  menus are visible.
1155         */
1156        public void onMenuVisibilityChanged(boolean isVisible);
1157    }
1158
1159    /**
1160     * A tab in the action bar.
1161     *
1162     * <p>Tabs manage the hiding and showing of {@link Fragment}s.
1163     *
1164     * @deprecated Action bar navigation modes are deprecated and not supported by inline
1165     * toolbar action bars. Consider using other
1166     * <a href="http://developer.android.com/design/patterns/navigation.html">common
1167     * navigation patterns</a> instead.
1168     */
1169    @Deprecated
1170    public static abstract class Tab {
1171
1172        /**
1173         * An invalid position for a tab.
1174         *
1175         * @see #getPosition()
1176         */
1177        public static final int INVALID_POSITION = -1;
1178
1179        /**
1180         * Return the current position of this tab in the action bar.
1181         *
1182         * @return Current position, or {@link #INVALID_POSITION} if this tab is not currently in
1183         *         the action bar.
1184         */
1185        public abstract int getPosition();
1186
1187        /**
1188         * Return the icon associated with this tab.
1189         *
1190         * @return The tab's icon
1191         */
1192        public abstract Drawable getIcon();
1193
1194        /**
1195         * Return the text of this tab.
1196         *
1197         * @return The tab's text
1198         */
1199        public abstract CharSequence getText();
1200
1201        /**
1202         * Set the icon displayed on this tab.
1203         *
1204         * @param icon The drawable to use as an icon
1205         * @return The current instance for call chaining
1206         */
1207        public abstract Tab setIcon(Drawable icon);
1208
1209        /**
1210         * Set the icon displayed on this tab.
1211         *
1212         * @param resId Resource ID referring to the drawable to use as an icon
1213         * @return The current instance for call chaining
1214         */
1215        public abstract Tab setIcon(@DrawableRes int resId);
1216
1217        /**
1218         * Set the text displayed on this tab. Text may be truncated if there is not
1219         * room to display the entire string.
1220         *
1221         * @param text The text to display
1222         * @return The current instance for call chaining
1223         */
1224        public abstract Tab setText(CharSequence text);
1225
1226        /**
1227         * Set the text displayed on this tab. Text may be truncated if there is not
1228         * room to display the entire string.
1229         *
1230         * @param resId A resource ID referring to the text that should be displayed
1231         * @return The current instance for call chaining
1232         */
1233        public abstract Tab setText(int resId);
1234
1235        /**
1236         * Set a custom view to be used for this tab. This overrides values set by
1237         * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}.
1238         *
1239         * @param view Custom view to be used as a tab.
1240         * @return The current instance for call chaining
1241         */
1242        public abstract Tab setCustomView(View view);
1243
1244        /**
1245         * Set a custom view to be used for this tab. This overrides values set by
1246         * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}.
1247         *
1248         * @param layoutResId A layout resource to inflate and use as a custom tab view
1249         * @return The current instance for call chaining
1250         */
1251        public abstract Tab setCustomView(int layoutResId);
1252
1253        /**
1254         * Retrieve a previously set custom view for this tab.
1255         *
1256         * @return The custom view set by {@link #setCustomView(View)}.
1257         */
1258        public abstract View getCustomView();
1259
1260        /**
1261         * Give this Tab an arbitrary object to hold for later use.
1262         *
1263         * @param obj Object to store
1264         * @return The current instance for call chaining
1265         */
1266        public abstract Tab setTag(Object obj);
1267
1268        /**
1269         * @return This Tab's tag object.
1270         */
1271        public abstract Object getTag();
1272
1273        /**
1274         * Set the {@link TabListener} that will handle switching to and from this tab.
1275         * All tabs must have a TabListener set before being added to the ActionBar.
1276         *
1277         * @param listener Listener to handle tab selection events
1278         * @return The current instance for call chaining
1279         */
1280        public abstract Tab setTabListener(TabListener listener);
1281
1282        /**
1283         * Select this tab. Only valid if the tab has been added to the action bar.
1284         */
1285        public abstract void select();
1286
1287        /**
1288         * Set a description of this tab's content for use in accessibility support.
1289         * If no content description is provided the title will be used.
1290         *
1291         * @param resId A resource ID referring to the description text
1292         * @return The current instance for call chaining
1293         * @see #setContentDescription(CharSequence)
1294         * @see #getContentDescription()
1295         */
1296        public abstract Tab setContentDescription(@StringRes int resId);
1297
1298        /**
1299         * Set a description of this tab's content for use in accessibility support.
1300         * If no content description is provided the title will be used.
1301         *
1302         * @param contentDesc Description of this tab's content
1303         * @return The current instance for call chaining
1304         * @see #setContentDescription(int)
1305         * @see #getContentDescription()
1306         */
1307        public abstract Tab setContentDescription(CharSequence contentDesc);
1308
1309        /**
1310         * Gets a brief description of this tab's content for use in accessibility support.
1311         *
1312         * @return Description of this tab's content
1313         * @see #setContentDescription(CharSequence)
1314         * @see #setContentDescription(int)
1315         */
1316        public abstract CharSequence getContentDescription();
1317    }
1318
1319    /**
1320     * Callback interface invoked when a tab is focused, unfocused, added, or removed.
1321     *
1322     * @deprecated Action bar navigation modes are deprecated and not supported by inline
1323     * toolbar action bars. Consider using other
1324     * <a href="http://developer.android.com/design/patterns/navigation.html">common
1325     * navigation patterns</a> instead.
1326     */
1327    @Deprecated
1328    public interface TabListener {
1329
1330        /**
1331         * Called when a tab enters the selected state.
1332         *
1333         * @param tab The tab that was selected
1334         * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute
1335         *        during a tab switch. The previous tab's unselect and this tab's select will be
1336         *        executed in a single transaction. This FragmentTransaction does not support
1337         *        being added to the back stack.
1338         */
1339        public void onTabSelected(Tab tab, FragmentTransaction ft);
1340
1341        /**
1342         * Called when a tab exits the selected state.
1343         *
1344         * @param tab The tab that was unselected
1345         * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute
1346         *        during a tab switch. This tab's unselect and the newly selected tab's select
1347         *        will be executed in a single transaction. This FragmentTransaction does not
1348         *        support being added to the back stack.
1349         */
1350        public void onTabUnselected(Tab tab, FragmentTransaction ft);
1351
1352        /**
1353         * Called when a tab that is already selected is chosen again by the user.
1354         * Some applications may use this action to return to the top level of a category.
1355         *
1356         * @param tab The tab that was reselected.
1357         * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute
1358         *        once this method returns. This FragmentTransaction does not support
1359         *        being added to the back stack.
1360         */
1361        public void onTabReselected(Tab tab, FragmentTransaction ft);
1362    }
1363
1364    /**
1365     * Per-child layout information associated with action bar custom views.
1366     */
1367    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
1368        /**
1369         * Gravity for the view associated with these LayoutParams.
1370         *
1371         * @see android.view.Gravity
1372         */
1373        public int gravity = Gravity.NO_GRAVITY;
1374
1375        public LayoutParams(@NonNull Context c, AttributeSet attrs) {
1376            super(c, attrs);
1377
1378            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ActionBarLayout);
1379            gravity = a.getInt(R.styleable.ActionBarLayout_android_layout_gravity, Gravity.NO_GRAVITY);
1380            a.recycle();
1381        }
1382
1383        public LayoutParams(int width, int height) {
1384            super(width, height);
1385            this.gravity = Gravity.CENTER_VERTICAL | GravityCompat.START;
1386        }
1387
1388        public LayoutParams(int width, int height, int gravity) {
1389            super(width, height);
1390            this.gravity = gravity;
1391        }
1392
1393        public LayoutParams(int gravity) {
1394            this(WRAP_CONTENT, MATCH_PARENT, gravity);
1395        }
1396
1397        public LayoutParams(LayoutParams source) {
1398            super(source);
1399
1400            this.gravity = source.gravity;
1401        }
1402
1403        public LayoutParams(ViewGroup.LayoutParams source) {
1404            super(source);
1405        }
1406    }
1407}
1408