Мда, давно не писал я статей на Хабр. Что ж, буду это дело исправлять.
Вообще, 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 — Навигация с помощью вкладок и выпадающего списка
ссылка на оригинал статьи http://habrahabr.ru/post/189676/
Добавить комментарий