- PVSM.RU - https://www.pvsm.ru -

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

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

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

Split ActionBar

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

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) [3] и setDisplayShowTitleEnabled(false) [4].

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 [5]» и используем атрибут yourapp:actionViewClass. Программно изменить разметку MenuItem’a можно с помощью методов MenuItemCompat setActionView(MenuItem item, int resId) [6] и setActionView(MenuItem item, View view) [7], получить текущий View – getActionView(MenuItem item) [8].

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

Action Provider

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

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

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

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

ShareActionProvider

В Android есть свой ActionProvider для отправки контента – ShareActionProvider [15]. Когда создаём меню с ним, необходимо в методе onCreateOptionsMenu получить его экземпляр с помощью MenuItemCompat.getActionProvider(MenuItem) [16] и вызвать setShareIntent() [17], куда передать 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) [18] и setDisplayHomeAsUpEnabled(true) [19].

Для API 11+

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

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

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

Автор: ED98

Источник [21]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/android-development/52754

Ссылки в тексте:

[1] первой: http://habrahabr.ru/post/189680/

[2] второй: http://habrahabr.ru/post/189678/

[3] setDisplayShowHomeEnabled(false): http://developer.android.com/reference/android/support/v7/app/ActionBar.html#setDisplayShowHomeEnabled(boolean)

[4] setDisplayShowTitleEnabled(false): http://developer.android.com/reference/android/support/v7/app/ActionBar.html#setDisplayShowTitleEnabled(boolean)

[5] schemas.android.com/apk/res-auto: http://schemas.android.com/apk/res-auto

[6] setActionView(MenuItem item, int resId): http://developer.android.com/reference/android/support/v4/view/MenuItemCompat.html#setActionView(android.view.MenuItem, int)

[7] setActionView(MenuItem item, View view): http://developer.android.com/reference/android/support/v4/view/MenuItemCompat.html#setActionView(android.view.MenuItem, android.view.View)

[8] getActionView(MenuItem item): http://developer.android.com/reference/android/support/v4/view/MenuItemCompat.html#getActionView(android.view.MenuItem)

[9] ActionProvider: http://developer.android.com/intl/ru/reference/android/support/v4/view/ActionProvider.html

[10] ActionProvider(Context context): http://developer.android.com/reference/android/support/v4/view/ActionProvider.html#ActionProvider(android.content.Context)

[11] onCreateActionView(MenuItem): http://developer.android.com/reference/android/support/v4/view/ActionProvider.html#onCreateActionView(android.view.MenuItem)

[12] onPerformDefaultAction(): http://developer.android.com/reference/android/support/v4/view/ActionProvider.html#onPerformDefaultAction()

[13] hasSubMenu(): http://developer.android.com/reference/android/support/v4/view/ActionProvider.html#hasSubMenu()

[14] onPrepareSubMenu (SubMenu subMenu): http://developer.android.com/reference/android/support/v4/view/ActionProvider.html#onPrepareSubMenu(android.view.SubMenu)

[15] ShareActionProvider: http://developer.android.com/intl/ru/reference/android/support/v7/widget/ShareActionProvider.html

[16] MenuItemCompat.getActionProvider(MenuItem): http://developer.android.com/reference/android/support/v4/view/MenuItemCompat.html#getActionProvider(android.view.MenuItem)

[17] setShareIntent(): http://developer.android.com/reference/android/support/v7/widget/ShareActionProvider.html#setShareIntent(android.content.Intent)

[18] setHomeButtonEnabled(true): http://developer.android.com/reference/android/support/v7/app/ActionBar.html#setHomeButtonEnabled(boolean)

[19] setDisplayHomeAsUpEnabled(true): http://developer.android.com/reference/android/support/v7/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)

[20] отсюда: http://developer.android.com/intl/ru/guide/topics/ui/actionbar.html

[21] Источник: http://habrahabr.ru/post/189676/