Как убрать toolbar android studio
Перейти к содержимому

Как убрать toolbar android studio

  • автор:

ActionBar (Панель действий)

Начиная с Android 3.0 (API 11), в приложениях появилась возможность использовать панель действий ActionBar, которая сочетает в себе заголовок и меню, упрощая навигацию и предоставляя быстрый доступ к частым операциям.

ActionBar заменяет Options Menu, которое было в ранних версиях Android, используя новые дополнительные параметры для меню. По умолчанию, новые проекты, создаваемые через шаблоны Empty Activity и др., уже содержат ActionBar. Следует отметить, что в Android 5.0 появился новый компонент Toolbar, который является дальнейшим развитием ActionBar. И он активно вытесняет панель действий. Но вам всё равно следует изучить работу ActionBar, так как основные принципы работы завязаны на ней.

Если запустить программу как есть из шаблона Empty Activity, то увидим заголовок программы.

ActionBar

Если в код программы добавить методы для меню, то справа появится значок из трёх вертикальных точек.

Если щёлкнуть по значку из трёх точек, выстроенных по вертикали, то увидим всплывающее меню с единственным пунктом 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/Toolbar и избежать утечек памяти?

У меня есть Activity с контейнером фрагментов. В зависимости от того, какой фрагмент в данный момент находится в контейнере, мне нужно динамически менять меню ActionBar’а и передать события этого меню текущему фрагменту. Для этого, я вызываю invalidateOptionsMenu() чтобы добиться вызова onCreateOptionsMenu() и выставляю соответствующие слушатели:

@Override public boolean onCreateOptionsMenu(Menu menu) < menu.clear(); // Пытаюсь очистить существующим методом Fragment fragment = getSupportFragmentManager().findFragmentByTag(mCurrentFragmentTag); if (fragment instanceof PlayersView) < final PlayersView view = (PlayersView) fragment; getMenuInflater().inflate(R.menu.menu_main_players, menu); SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setOnCloseListener(new SearchView.OnCloseListener() < @Override public boolean onClose() < view.loadData(false); return false; >>); return true; > return super.onCreateOptionsMenu(menu); >

ad25f701a7fc4b41af384592762dea01.jpg

И всё работает неплохо, вот только проблема возникает, когда я переключаю фрагменты. Из-за этих Listener’ов происходит утечка фрагмента, которую отлавливает LeakCanary:

SearchView должен был быть выкинут и уничтожен сборщиком мусора, но вместо этого он находится в памяти и удерживает ссылку на фрагмент из-за Listener’а. Как избавиться от всех ссылок и избежать утечек памяти? По идее, Menu.clear() должен это делать, но на деле толку от метода ноль. Может можно как-то полностью пересоздать объект Menu, вместо переиспользования одной инстанции?

  • Вопрос задан более трёх лет назад
  • 237 просмотров

Комментировать

Решения вопроса 1

gim0

Андрей Мывреник @gim0 Автор вопроса

Немного неудобно, но решил следующим образом. Во-первых, я перенёс логику метода onCreateOptionsMenu в сами фрагменты, чтобы не делать кучу проверок в Activity на то, какой фрагмент в данный момент находится в контейнере. Во-вторых, в фрагментах я сохраняю ссылку на SearchView и удаляю все слушатели самостоятельно:

private SearchView mActionSearch; private void disposeActions() < if (mActionSearch != null) < mActionSearch.setOnQueryTextListener(null); mActionSearch.setOnCloseListener(null); >mActionSearch = null; > @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) < disposeActions(); inflater.inflate(R.menu.menu_main_players, menu); mActionSearch = (SearchView) menu.findItem(R.id.action_search).getActionView(); mActionSearch.setOnCloseListener(new SearchView.OnCloseListener() < @Override public boolean onClose() < loadData(false); return false; >>); // . > @Override public void onDetach()

Возможно кому-то окажется полезным.

Ответ написан более трёх лет назад

Нравится 1 1 комментарий

Как убрать Toolbar

Помогите. Создаю первое приложение на андроид и хочу весь экран заполнить одним изображением, а поверх его написать текст и кнопки расставить. Создаю под андроид 5.0. Мне мешает этот белый тулбар, где написано «WaY». Перепробовал все, что умею, не уходит. Как его убрать? Фото 1 Вот разметка Фото 2

Отслеживать
задан 5 июн 2016 в 13:05
1,093 13 13 серебряных знаков 26 26 бронзовых знаков
Разметку и код пишите, пожалуйста текстом, а не скриншотами
5 июн 2016 в 13:36

Стоит заметить, что фон устанавливается атрибутом android:background для контейнера, а не так, как у вас.

5 июн 2016 в 14:10

@pavlofff , так этим атрибутом устанавливается цвет, т.е. каким будет заливка, а атрибут src указывает на изображение? Разве нет?

5 июн 2016 в 14:22

ImageView тут вообще не нужен, фон устанавливается LinearLayout (основному контейнеру). Вы можете указать любой ресурс в качестве бэкграунда, в том числе и изображение

5 июн 2016 в 14:26
@pavlofff, о, спасибо)
5 июн 2016 в 14:38

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

в res/values/styles.xml измените тему, от которой наследуется ваша тема, на подходящую вам с окончанием .NoActionBar

  

Отслеживать
ответ дан 5 июн 2016 в 13:41
36.8k 6 6 золотых знаков 48 48 серебряных знаков 125 125 бронзовых знаков

Можно сменить тему а ещё можно програмно скрыть:

getSupportActionBar().hide(); 

Но лучше, конечно, через тему

Отслеживать
ответ дан 5 июн 2016 в 13:49
69.8k 9 9 золотых знаков 66 66 серебряных знаков 124 124 бронзовых знака

Данный вариант используется, если нужно убрать Toolbar (ActionBar) только в одной активити, а не во всем приложении. Тогда вариант с темой не подходит, а это будет правильное решение.

5 июн 2016 в 14:07

@pavlofff, лично на мой вкус лучше через тему, даже если только для одной активити) Предложенный в ответе способ мне представляется лишь самым простым и быстрым решением проблемы.

5 июн 2016 в 14:10

Я имею ввиду, что активити в приложении несколько штук и только на некоторых из них нужно убрать Toolbar, тогда ваш ответ поможет решить проблему.

5 июн 2016 в 14:12

@pavlofff, я понимаю что вы хотите сказать, я просто выражаю свое личное мнение о том, что правильнее унаследовать от общей темы одну для нужных активити и прописать там аттрибут, скрывающий тулбар. Так сложнее, но, на мой взгляд вернее. А программное скрытие мне представляется, почему-то, костылём)

5 июн 2016 в 14:16

@Артем, создать тему, наследующую тему приложения, указать там аттрибут для скрытия тулбара и прописать эту тему для конкретной активити в манифесте или в onCreate активити, до вызова super.onCreate

5 июн 2016 в 15:17

Вообще в res/values/styles.xml, Вы всегда можете создать дополнительно несколько тем на выбор(Dark/Light/.NoActionBar, и т.д.), в которые и будете прописывать свои опции/цвета(обычно используется для большого кол-ва экранов в Вашем приложении).

После чего в активити прописываете наобходимые Вам темы для конкретного экрана:

protected void onCreate(Bundle savedInstanceState) < setTheme(R.style.НазваниеСозданнойТемы); 

Отслеживать
ответ дан 13 сен 2016 в 11:31
2,766 1 1 золотой знак 13 13 серебряных знаков 30 30 бронзовых знаков

  • java
  • android
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951

Замена панели действий

Одним из наиболее распространенных способов использования Toolbar является замена панели действий по умолчанию на настраиваемую Toolbar (при создании нового проекта Android используется панель действий по умолчанию). Toolbar Так как предоставляет возможность добавлять фирменные логотипы, заголовки, пункты меню, кнопки навигации и даже пользовательские представления в раздел панели приложения пользовательского интерфейса действия, он предлагает значительное обновление по сравнению с панелью действий по умолчанию.

Замена панели действий приложения по умолчанию на : Toolbar

  1. Создайте новую пользовательскую тему и измените свойства приложения, чтобы оно использовало эту новую тему.
  2. windowActionBar Отключите атрибут в пользовательской теме и включите windowNoTitle атрибут .
  3. Определите макет для Toolbar .
  4. Toolbar Включите макет в файл макета Действия Main.axml.
  5. Добавьте код в метод Действия OnCreate , чтобы найти Toolbar и вызвать SetActionBar для установки ToolBar в качестве панели действий.

Этот процесс подробно описан в следующих разделах. Создается простое приложение, а его панель действий заменяется настроенным Toolbar .

Запуск проекта приложения

Создайте проект Android с именем ToolbarFun (дополнительные сведения о создании проекта Android см. в разделе Hello, Android ). После создания этого проекта задайте для целевого и минимального уровней API Android значение Android 5.0 (уровень API 21 — Lollipop) или более поздней версии. Дополнительные сведения о настройке уровней версий Android см. в разделе Общие сведения об уровнях API Android. При сборке и запуске приложения отображается панель действий по умолчанию, как показано на снимке экрана:

Снимок экрана: панель действий по умолчанию

Создание пользовательской темы

Откройте каталог Resources/values и создайте файл с именемstyles.xml. Замените его содержимое следующим XML-кодом:

     

Этот XML-код определяет новую пользовательскую тему MyTheme , основанную на теме Theme.Material.Light.DarkActionBar в Lollipop. Атрибут windowNoTitle имеет значение , true чтобы скрыть строку заголовка:

true 

Чтобы отобразить пользовательскую панель инструментов, необходимо отключить значение по умолчанию ActionBar :

false 

Для цвета фона панели инструментов используется оливково-зеленый colorPrimary параметр:

#5A8622 

Применение пользовательской темы

Измените свойства/AndroidManifest.xml и добавьте следующий android:theme атрибут в элемент , чтобы приложение использовало настраиваемую MyTheme тему:

Дополнительные сведения о применении пользовательской темы к приложению см. в разделе Использование пользовательских тем.

Определение макета панели инструментов

В каталоге Resources/layout создайте файл с именемtoolbar.xml. Замените его содержимое следующим XML-кодом:

Этот XML-код определяет пользовательский Toolbar код, заменяющий панель действий по умолчанию. Минимальная высота Toolbar задается в размере заменяемой панели действий:

android:minHeight="?android:attr/actionBarSize" 

Цвет фона Toolbar задается в оливково-зеленый цвет, определенный ранее в styles.xml:

android:background="?android:attr/colorPrimary" 

Начиная с Lollipop атрибут android:theme можно использовать для стиля отдельного представления. Темы, представленные ThemeOverlay.Material в Lollipop, позволяют наложить темы по умолчанию Theme.Material , перезаписав соответствующие атрибуты, чтобы сделать их светлыми или темными. В этом примере использует темную тему, Toolbar чтобы ее содержимое было светлым:

android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" 

Этот параметр используется для контрастирования элементов меню с более темным цветом фона.

Включение макета панели инструментов

Измените файл макета Resources/layout/Main.axml и замените его содержимое следующим XML-кодом:

Этот макет включает определенный Toolbar в toolbar.xml и использует RelativeLayout , чтобы указать, что Toolbar объект должен быть размещен в верхней части пользовательского интерфейса (над кнопкой).

Поиск и активация панели инструментов

Измените файл MainActivity.cs и добавьте следующую инструкцию using:

using Android.Views; 

Кроме того, добавьте следующие строки кода в конец OnCreate метода :

var toolbar = FindViewById(Resource.Id.toolbar); SetActionBar(toolbar); ActionBar.Title = "My Toolbar"; 

Этот код находит вызовы Toolbar SetActionBar и , чтобы использовать Toolbar характеристики панели действий по умолчанию. Заголовок панели инструментов меняется на Моя панель инструментов. Как показано в этом примере кода, ToolBar на объект можно напрямую ссылаться как на панель действий. Скомпилируйте и запустите это приложение— настраиваемое Toolbar отображается вместо панели действий по умолчанию:

Снимок экрана: настраиваемая панель инструментов с зеленой цветовой схемой

Обратите внимание, что Toolbar стиль имеет стиль независимо Theme.Material.Light.DarkActionBar от темы, которая применяется к остальной части приложения.

Если при запуске приложения возникает исключение, см. раздел Устранение неполадок ниже.

Добавить пункты меню

В этом разделе меню добавляются в Toolbar . Верхняя правая область зарезервирована ToolBar для пунктов меню. Каждый пункт меню (также называемый элементом действия) может выполнять действие в текущем действии или выполнять действие от имени всего приложения.

Добавление меню в : Toolbar

  1. Добавьте значки меню (при необходимости) в mipmap- папки проекта приложения. Google предоставляет набор бесплатных значков меню на странице Значки материала .
  2. Определите содержимое пунктов меню, добавив новый файл ресурсов меню в разделе Ресурсы или меню.
  3. Реализуйте OnCreateOptionsMenu метод Действия — этот метод раздувает пункты меню.
  4. OnOptionsItemSelected Реализация метода Activity — этот метод выполняет действие при касании пункта меню.

В следующих разделах подробно демонстрируется этот процесс, добавляя пункты меню "Изменить" и "Сохранить " в настраиваемый Toolbar .

Значки меню "Установка"

Продолжая работу с примером ToolbarFun приложения, добавьте значки меню в проект приложения. Скачайте значки панели инструментов, распакуйте и скопируйте содержимое извлеченных папок MIP-карт в папку MIP-карты проекта в разделе ToolbarFun/Resources и включите каждый добавленный файл значков в проект.

Определение ресурса меню

Создайте новый подкаталог меню в разделе Ресурсы. В подкаталоге меню создайте новый файл ресурсов меню с именемtop_menus.xml и замените его содержимое следующим XML-кодом:

Этот XML-код создает три пункта меню:

  • Пункт меню Правка , использующий ic_action_content_create.png значок (карандаш).
  • Пункт меню Сохранить , использующий ic_action_content_save.png значок (дискета).
  • Пункт меню "Настройки" , не имеющий значка.

Атрибутам showAsAction пунктов меню "Изменить" и "Сохранить " задано значение ifRoom . Этот параметр приводит к отображению этих пунктов меню в Toolbar , если для них достаточно места. Для пункта меню "Настройки" задано значение showAsAction never . Это приводит к отображению меню "Настройки" в меню переполнения (три вертикальные точки).

Реализация OnCreateOptionsMenu

Добавьте следующий метод в файл MainActivity.cs:

public override bool OnCreateOptionsMenu(IMenu menu)

Android вызывает OnCreateOptionsMenu метод , чтобы приложение я указать ресурс меню для действия. В этом методе ресурсtop_menus.xml увеличивается до переданного menu . Этот код приводит к отображению новых пунктов меню "Изменить", "Сохранить" и "Параметры" Toolbar в .

Реализация OnOptionsItemSelected

Добавьте следующий метод в файл MainActivity.cs:

public override bool OnOptionsItemSelected(IMenuItem item)

Когда пользователь касается пункта меню, Android вызывает OnOptionsItemSelected метод и передает выбранный пункт меню. В этом примере реализация просто отображает всплывающее уведомление, указывающее, какой пункт меню был коснулся.

Выполните сборку и запустите ToolbarFun , чтобы увидеть новые пункты меню на панели инструментов. Теперь Toolbar отображается три значка меню, как показано на этом снимке экрана:

Схема, иллюстрирующая расположения пунктов меню

Когда пользователь касается пункта меню Правка , отображается всплывающее уведомление, указывающее, что OnOptionsItemSelected метод был вызван:

Снимок экрана: всплывающее уведомление, отображаемое при нажатии кнопки Изменить элемент

Когда пользователь касается меню переполнения, отображается пункт меню Параметры . Как правило, в меню переполнения следует помещать менее распространенные действия. В этом примере используется меню переполнения для параметров, так как оно используется не так часто, как Изменить и Сохранить:

Снимок экрана: пункт меню

Дополнительные сведения о меню Android см. в разделе Меню разработчика Android.

Устранение неполадок

Следующие советы помогут устранить проблемы, которые могут возникнуть при замене панели действий панелью инструментов.

Действие уже имеет панель действий

Если приложение неправильно настроено для использования пользовательской темы, как описано в разделе Применение пользовательской темы, при запуске приложения может возникнуть следующее исключение:

Ошибка, которая может возникнуть, если пользовательская тема не используется

Кроме того, может появиться следующее сообщение об ошибке: Java.Lang.IllegalStateException: Это действие уже имеет панель действий, предоставленную декором окна.

Чтобы исправить эту ошибку, убедитесь, что android:theme атрибут для настраиваемой темы добавлен в (в разделе Свойства/AndroidManifest.xml), как описано выше в разделе Применение пользовательской темы. Кроме того, эта ошибка может быть вызвана, если Toolbar макет или пользовательская тема настроены неправильно.

Связанные ссылки

  • Панель инструментов Lollipop (пример)
  • Панель инструментов AppCompat (пример)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *