ActionBar (Панель действий)
3-й курс/Закрытая зона
Немного теории
Начиная с Android 3.0 (API 11), в приложениях появилась возможность использовать панель действий ActionBar, которая сочетает в себе заголовок и меню, упрощая навигацию и предоставляя быстрый доступ к частым операциям.
ActionBar заменяет Options Menu, которое было в ранних версиях Android, используя новые дополнительные параметры для меню. По умолчанию, новые проекты, создаваемые через шаблоны Empty Activity и др., уже содержат ActionBar. Следует отметить, что в Android 5.0 появился новый компонент Toolbar, который является дальнейшим развитием ActionBar. И он активно вытесняет панель действий. Но вам всё равно следует изучить работу ActionBar, так как основные принципы работы завязаны на ней.
Если запустить программу как есть из шаблона Empty Activity, то увидим заголовок программы.
Если в код программы добавить методы для меню, то справа появится значок из трёх вертикальных точек.
Если щёлкнуть по значку из трёх точек, выстроенных по вертикали, то увидим всплывающее меню с единственным пунктом Settings. Не прикладывая никаких усилий, мы получили готовый элемент ActionBar в своём приложении.
Давайте разбираться, что происходит за кулисами приложения. За появление панели действий отвечает тема Theme.Holo или её производные. В API 21 и выше произошли небольшие изменения. Как я уже сказал выше, появился новый компонент ToolBar, который может заменить панель действий в активности. Поэтому тут нужно быть внимательным и выбирать соответствующую тему, например, Theme.Material.Light.DarkActionBar. Для старых устройств используются библиотеки совместимости. В этом случае активность наследуется от AppCompatActivity, а используемая тема Theme.AppCompat или его производные, например, Theme.AppCompat.Light.DarkActionBar.
В студии версии 4.1 снова всё поменяли и теперь используется тема Theme.MaterialComponents.DayNight.DarkActionBar.
Прячем и показываем ActionBar
Изначально существовали два вида ActionBar для новых устройств и для старых устройств при помощи библиотеки совместимости. Не смешивайте вызовы методов из разных классов, а то получите ошибку. На сегодняшний день студия создаёт проекты с применением библиотеки AndroidX, поэтому будем использовать классы из неё.
Чтобы увидеть разницу в активности с ActionBar и без неё, напишем простой пример. Добавим на форму компонент ToggleButton и пропишем код, скрывающий и показывающий ActionBar:
Вы вошли на сайт, как гость.
Необходимо зарегистрироваться, чтобы прочитать статью
Источник
ActionBar на Android 2.1+ с помощью Support Library. Часть 3 — Полезные функции
Всем доброго времени суток!
Мда, давно не писал я статей на Хабр. Что ж, буду это дело исправлять.
Вообще, ActionBar в Android – довольно сложная штука. В первой и второй частях я рассмотрел только основные его функции – меню и навигация. Но есть ведь и множество дополнительных: Split ActionBar, кастомный View для элемента меню и ActionProvider. О них и пойдёт речь. Кроме того, бонус: многие знают, что кнопка Up служит для перехода на предыдущее Activity. Но если на экран можно попасть только с одной другой Activity, то можно не кодить переход вверх. Заинтригованы? Прошу под кат.
Split ActionBar
Split ActionBar – это полоска внизу экрана с элементами меню. Он может быть использован, если в основном ActionBar не хватает места (в середине), или он отсутствует (справа). Добавить его легко: достаточно в файле манифеста добавить для Activity или всего приложения следующие строки:
Чтобы убрать верхний ActionBar (как на рисунке справа) нужно вызвать методы ActionBar setDisplayShowHomeEnabled(false) и setDisplayShowTitleEnabled(false).
ActionView
По умолчанию элемент меню имеет вид картинки (иконки). Есть два способа изменить его:
-Добавить атрибут actionLayout для тега . Он принимает на вход ссылку на layout-файл
-Добавить атрибут actionViewClass для тега , куда записать имя класса, наследника View, для использования вместо стандартной вьюхи
В пространстве имён 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 и прикреплённым контентом:
Так как контент на экране может изменяться (например, перелистывание картинок), то нужно вызывать setShareIntent() каждый раз, когда контент меняется.
Родительская Activity
Если на экран в приложении можно попасть только с ОДНОЙ другой Activity, то имеет смысл настроить автоматический переход на неё по нажатию кнопки Up в ActionBar. Сделать это очень просто: в файле манифеста для нужной Activity добавить строки:
Напомню, чтобы кнопка Home работала как Up, вызовите методы SupportActionBar setHomeButtonEnabled(true) и setDisplayHomeAsUpEnabled(true).
Вся информация взята отсюда (официальный гайдлайн на английском).
Часть 1 — Добавление Support Library в проект, простой пример, поиск
Часть 2 — Навигация с помощью вкладок и выпадающего списка
Источник
Как показать и скрыть ActionBar с помощью AppCompat v.7
У меня есть простое приложение, которое отображает текст.
Приложение начинается с главного экрана с несколькими параметрами (например, с помощью кнопки информации, которая приводит к информации об этом приложении, кнопке просмотра, которая позволяет пользователю видеть все отдельные фрагменты текста, которые могут отображаться). Основная кнопка приводит к другому экрану, на котором отображается текст. Прокручивая влево и вправо, он может видеть разные фрагменты текста. Это основная цель приложения.
В настоящее время у меня есть ActionBar. My MainActivity.Java расширяет AppCompatActivity. Все в приложении находится в этом упражнении.
Теперь я хочу сделать так, чтобы ActionBar появился только в режиме «Просмотр», а не на экране запуска или «info» / «browse».
Возможно ли иметь ActionBar в одной части приложения и нет ActionBar в другой части приложения? (И держать все в одной деятельности?)
Я пытался сделать это безрезультатно. Если это возможно, что мне делать дальше?
До сих пор я пытался сделать следующее:
1) Создайте эту тему
И примените его к MainActivity …
…. После этого ActionBar все еще был там. (Это происходит из этого сообщения SO ( android: windowNoTitle не будет скрывать панель действий с помощью appcompat-v7 21.0.0 )
2) Еще одна попытка состояла в том, чтобы добавить это в onCreate.
Это произошло после изучения этой SO-почты: ( Как скрыть панель действий до создания активности, а затем снова показать ее? )
В действиях, в которых вы не хотите иметь панель действий, используйте тему, полученную из Theme.AppCompat.NoActionBar или Theme.AppCompat.Light.NoActionBar . Эта активность никогда не сможет отобразить панель действий, если вы не предоставите свой собственный через setSupportActionBar(Toolbar) .
В действиях, в которых вы хотите, чтобы панель действий использовала тему, полученную из Theme.AppCompat , Theme.AppCompat.Light или Theme.AppCompat.Light.DarkActionBar . Это позволит вам динамически скрывать или показывать панель действий в такой деятельности. Используя эти темы, вы не сможете предоставить свою собственную панель действий.
При работе с панелью действий appcompat-v7 вам нужно получить ее, вызвав getSupportActionBar() вместо getActionBar() .
Вы можете скрыть и показать ActionBar программно.
Это также можно сделать из фрагментов
Как отметил @RenniePet ,
Вы должны вызвать ((AppCompatActivity)getActivity()).getSupportActionBar() , если вы используете Toolbar в качестве ActionBar .
Расширьте свою активность как AppCompatActivity а затем используйте панель действий как: –
Удалите андроид в окне itemActionbar.just, как показано ниже:
Надеюсь, это может вам помочь.
AppCompatActivity имеет собственную встроенную панель инструментов. Вам не нужно использовать дополнительное определение панели инструментов в главном xml.
Просто позвоните getSupportActionBar (). Show ()
Надеюсь, это может быть решением. Он работал над моей системой:
Источник