ActionBar на Android 2.1+ с помощью Support Library. Часть 3 — Полезные функции

от автора

Всем доброго времени суток!

Мда, давно не писал я статей на Хабр. Что ж, буду это дело исправлять.
Вообще, ActionBar в Android – довольно сложная штука. В первой и второй частях я рассмотрел только основные его функции – меню и навигация. Но есть ведь и множество дополнительных: Split ActionBar, кастомный View для элемента меню и ActionProvider. О них и пойдёт речь. Кроме того, бонус: многие знают, что кнопка Up служит для перехода на предыдущее Activity. Но если на экран можно попасть только с одной другой Activity, то можно не кодить переход вверх. Заинтригованы? Прошу под кат.

Split ActionBar

Split ActionBar – это полоска внизу экрана с элементами меню. Он может быть использован, если в основном ActionBar не хватает места (в середине), или он отсутствует (справа). Добавить его легко: достаточно в файле манифеста добавить для Activity или всего приложения следующие строки:

<manifest ...>     <activity …         uiOptions="splitActionBarWhenNarrow" ... > //Для API 14+         <meta-data android:name="android.support.UI_OPTIONS" // Для Support Library API 7+                    android:value="splitActionBarWhenNarrow" />     </activity> </manifest> 

Чтобы убрать верхний ActionBar (как на рисунке справа) нужно вызвать методы ActionBar setDisplayShowHomeEnabled(false) и setDisplayShowTitleEnabled(false).

ActionView

По умолчанию элемент меню имеет вид картинки (иконки). Есть два способа изменить его:
-Добавить атрибут actionLayout для тега . Он принимает на вход ссылку на layout-файл
-Добавить атрибут actionViewClass для тега , куда записать имя класса, наследника View, для использования вместо стандартной вьюхи

<menu xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:yourapp="http://schemas.android.com/apk/res-auto" >     <item android:id="@+id/custom_action "           android:title="@string/custom_action "           android:icon="@drawable/ic_custom_action "           yourapp:actionViewClass="com.you.app.CustomView" /> </menu> 

В пространстве имён android в старых версиях нет этих атрибутов, поэтому нужно использовать пространство имён Support Library – для этого добавляем строчку xmlns:yourapp=«schemas.android.com/apk/res-auto» и используем атрибут yourapp:actionViewClass. Программно изменить разметку MenuItem’a можно с помощью методов MenuItemCompat setActionView(MenuItem item, int resId) и setActionView(MenuItem item, View view), получить текущий View – getActionView(MenuItem item).

Один из примеров ActionView – SearchView, о нём подробнее написано здесь.

Action Provider

ActionProvider имеет много общего с ActionView. Он также заменяет кнопку на собственный layout, но может показывать выпадающий список и контролировать поведение элемента меню. Чтобы задать его для пункта меню, достаточно для тега добавить атрибут actionProviderClass, куда записать адрес вашего класса. Он должен наследоваться от ActionProvider и переопределять следующие методы:
ActionProvider(Context context) –конструктор, принимает на вход контекст, который нужно сохранить в поле класса для использования в других методах;
onCreateActionView(MenuItem) – здесь создаём вьюшку для элемента меню с помощью LayoutInflater, полученного из контекста, и возвращаем её;
onPerformDefaultAction() – вызывается, когда пользователь нажимает на пункт в ActionBar.

Если вы используете ActionProvider, то НЕ должны обрабатывать нажатия на него в onOptionsItemSelected(), ну или возвращать там false, потому что иначе onPerformDefaultAction() не будет вызван.

Если ваш ActionProvider показывает подменю, то нужно переопределить его метод hasSubMenu() и возвращать true. Тогда вместо onPerformDefaultAction() будет вызван onPrepareSubMenu (SubMenu subMenu). Там создаёте или изменяете подменю.

ShareActionProvider

В Android есть свой ActionProvider для отправки контента – ShareActionProvider. Когда создаём меню с ним, необходимо в методе onCreateOptionsMenu получить его экземпляр с помощью MenuItemCompat.getActionProvider(MenuItem) и вызвать setShareIntent(), куда передать Intent с ACTION_SEND и прикреплённым контентом:

private ShareActionProvider mShareActionProvider;  @Override public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.main_activity_actions, menu);      Intent share_intent = new Intent(Intent.ACTION_SEND);     intent.setType("image/*");      mShareActionProvider = (ShareActionProvider)  getActionProvider(menu.findItem(R.id.action_share));     mShareActionProvider.setShareIntent(share_intent);      return super.onCreateOptionsMenu(menu); } 

Так как контент на экране может изменяться (например, перелистывание картинок), то нужно вызывать setShareIntent() каждый раз, когда контент меняется.

Родительская Activity

Если на экран в приложении можно попасть только с ОДНОЙ другой Activity, то имеет смысл настроить автоматический переход на неё по нажатию кнопки Up в ActionBar. Сделать это очень просто: в файле манифеста для нужной Activity добавить строки:

<application ... >     <activity         android:name="com.you. app.MainActivity" ...> // Главная Activity         ...     </activity>    ...     <activity         android:name="com.you. app.DetailsActivity"         android:label="@string/title_activity_display_message"         android:parentActivityName="com.example.myfirstapp.MainActivity" > //Для API 16+         <meta-data             android:name="android.support.PARENT_ACTIVITY" // Для Support Library API 7+             android:value="com.you. app.MainActivity" />     </activity> </application> 

Напомню, чтобы кнопка Home работала как Up, вызовите методы SupportActionBar setHomeButtonEnabled(true) и setDisplayHomeAsUpEnabled(true).

Для API 11+

Если ваше приложение поддерживает только Android 3 или выше, то следует вместо методов MenuItemCompat использовать аналогичные у MenuItem, вместо SupportActionBar — ActionBar. Кроме того, все атрибуты в меню будут начинаться с android:, а строчка xmlns:yourapp=http://schemas.android.com/apk/res-auto не нужна.

Вся информация взята отсюда (официальный гайдлайн на английском).

Часть 1 — Добавление Support Library в проект, простой пример, поиск
Часть 2 — Навигация с помощью вкладок и выпадающего списка

ссылка на оригинал статьи http://habrahabr.ru/post/189676/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *