Pull to refresh

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

Reading time 4 min
Views 14K
Всем доброго времени суток!

Мда, давно не писал я статей на Хабр. Что ж, буду это дело исправлять.
Вообще, 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 — Навигация с помощью вкладок и выпадающего списка
Tags:
Hubs:
+9
Comments 0
Comments Leave a comment

Articles