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