Всем доброго времени суток!
Мда, давно не писал я статей на Хабр. Что ж, буду это дело исправлять.
Вообще, 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).
Вся информация взята отсюда (официальный гайдлайн на английском).
Часть 1 — Добавление Support Library в проект, простой пример, поиск
Часть 2 — Навигация с помощью вкладок и выпадающего списка
Автор: ED98