Содержание статьи

В Xamarin при разработке кроссплатформенных приложений часто возникает необходимость убрать стандартный Action Bar на Android и Navigation Bar на iOS, чтобы реализовать собственный интерфейс или расширенные элементы управления. На Android Action Bar автоматически создается при использовании AppCompatActivity и стандартной темы приложения, а на iOS Navigation Bar отображается на уровне NavigationPage в Xamarin.Forms.
Для Android существуют два основных подхода: изменение темы приложения в файле styles.xml с указанием NoActionBar и программное скрытие Action Bar через метод SupportActionBar.Hide() внутри активности. Выбор способа зависит от того, требуется ли глобальное или локальное скрытие Action Bar на отдельных экранах.
На iOS скрытие Navigation Bar выполняется через свойство NavigationPage.HasNavigationBar в коде страницы или с помощью кастомных PageRenderer для более гибкой настройки поведения. Эти методы позволяют управлять визуальным пространством экрана, улучшать пользовательский опыт и интегрировать элементы интерфейса, которые заменяют стандартную панель.
В статье рассмотрены конкретные способы скрытия Action Bar и Navigation Bar, приведены примеры кода для Android и iOS, а также рекомендации по проверке изменений и отладке, чтобы исключить конфликты с остальными компонентами интерфейса.
Отключение Action Bar в Android через тему приложения
Для полного удаления Action Bar на Android можно изменить тему приложения в файле Resources/values/styles.xml. Необходимо использовать наследование от темы Theme.AppCompat.Light.NoActionBar или Theme.AppCompat.NoActionBar, чтобы стандартная панель не создавалась автоматически при запуске активности.
Пример определения темы в styles.xml:
| Элемент | Значение |
|---|---|
| name | AppTheme |
| parent | Theme.AppCompat.Light.NoActionBar |
| colorPrimary | #2196F3 |
| colorPrimaryDark | #1976D2 |
| colorAccent | #FF4081 |
После этого нужно убедиться, что выбранная тема применяется в AndroidManifest.xml для всей активности или для конкретного экрана:
| Атрибут | Значение |
|---|---|
| android:theme | @style/AppTheme |
Этот подход исключает необходимость программного скрытия Action Bar и обеспечивает единый стиль для всех экранов приложения. При использовании кастомных Toolbar можно добавить их в макеты отдельных активностей без конфликта с системой.
Удаление Action Bar в Android через код Activity
В Xamarin на Android Action Bar можно убрать программно, что позволяет скрывать его на отдельных экранах без изменения глобальной темы. Для этого используют методы Hide() и RequestWindowFeature() внутри активности.
Пример последовательности действий в MainActivity:
- Перед вызовом SetContentView добавить RequestWindowFeature(WindowFeatures.NoTitle) для удаления заголовка.
- Вызвать SupportActionBar.Hide(), чтобы скрыть панель действий, если активность наследует AppCompatActivity.
- Убедиться, что код находится до или сразу после base.OnCreate(savedInstanceState), чтобы изменения применились корректно.
Пример кода:
- Наследуем MainActivity от AppCompatActivity.
- В методе OnCreate вызвать:
- RequestWindowFeature(WindowFeatures.NoTitle);
- SupportActionBar.Hide();
- Установить макет с помощью SetContentView(Resource.Layout.activity_main);
Этот метод удобен, когда нужно оставить Action Bar на большинстве экранов, но скрыть его на определенных страницах, например, при показе полноэкранного контента или кастомных элементов интерфейса.
Настройка Toolbar вместо Action Bar в Android

Для замены стандартного Action Bar в Xamarin.Android используется Toolbar, который предоставляет больше контроля над внешним видом и функционалом приложения.
Создайте файл макета Toolbar, например toolbar.axml, с минимальной структурой:
<androidx.appcompat.widget.Toolbar
android:id=»@+id/toolbar»
android:layout_width=»match_parent»
android:layout_height=»?attr/actionBarSize»
android:background=»?attr/colorPrimary» />
В активности подключите Toolbar вместо Action Bar. Для этого в методе OnCreate выполните:
var toolbar = FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
Удаление стандартного Action Bar производится через тему приложения. В styles.xml используйте:
<style name=»AppTheme» parent=»Theme.AppCompat.Light.NoActionBar»>
</style>
Добавление кнопок и меню реализуется через OnCreateOptionsMenu и ресурс меню menu.xml:
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.menu, menu);
return true;
}
Toolbar поддерживает кастомизацию: можно добавлять логотип, текст заголовка и интерактивные элементы через методы SetTitle, SetLogo и обработчики событий кнопок.
Использование Toolbar вместо Action Bar повышает гибкость интерфейса и совместимость с современными версиями Android, позволяя точно управлять стилем и поведением верхней панели приложения.
Скрытие Navigation Bar на iOS в Xamarin.Forms
Для удаления Navigation Bar на iOS в Xamarin.Forms используется свойство NavigationPage.HasNavigationBar. В коде страницы установите:
NavigationPage.SetHasNavigationBar(this, false);
Это скрывает верхнюю панель для конкретной страницы. Для применения ко всем страницам приложения создайте базовую страницу или используйте глобальный подход через конструктор NavigationPage в App.xaml.cs:
var navPage = new NavigationPage(new MainPage());
NavigationPage.SetHasNavigationBar(navPage.CurrentPage, false);
MainPage = navPage;
Если требуется скрыть Navigation Bar только на отдельных страницах, метод SetHasNavigationBar вызывается в конструкторе каждой такой страницы перед добавлением элементов интерфейса.
Для полного контроля над статус-баром используйте iOS-specific API через Xamarin.Forms.PlatformConfiguration.iOS, например скрытие индикатора состояния:
On
Такой подход позволяет управлять верхней областью экрана без изменения глобальной навигационной структуры, сохраняя стандартные переходы между страницами.
Использование кастомных PageRenderer для iOS

Для точного контроля Navigation Bar и других элементов интерфейса на iOS применяются кастомные PageRenderer. Создайте класс, наследующий PageRenderer в проекте iOS:
public class CustomPageRenderer : PageRenderer
{
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
NavigationController.SetNavigationBarHidden(true, false);
}
}
Подключение к конкретной странице выполняется через атрибут [assembly: ExportRenderer]:
[assembly: ExportRenderer(typeof(MyPage), typeof(CustomPageRenderer))]
PageRenderer позволяет скрывать Navigation Bar, изменять цвет фона, настраивать тени и границы. Для динамического управления можно переопределять методы ViewWillAppear и ViewWillDisappear.
Использование кастомного PageRenderer дает возможность интегрировать уникальные элементы интерфейса и управлять поведением верхней панели без изменения основного Xamarin.Forms-кода.
Совместное управление Action Bar на Android и iOS
Для синхронного управления верхней панелью на Android и iOS в Xamarin.Forms используют общий подход через свойства страницы и платформо-специфичные настройки.
На уровне Xamarin.Forms для скрытия Action Bar или Navigation Bar применяется:
NavigationPage.SetHasNavigationBar(this, false);
Для Android дополнительно нужно убедиться, что тема не содержит Action Bar:
<style name=»AppTheme» parent=»Theme.AppCompat.Light.NoActionBar»></style>
На iOS скрытие выполняется через кастомный PageRenderer:
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
NavigationController.SetNavigationBarHidden(true, false);
}
Для обеспечения одинакового поведения на обеих платформах рекомендуется использовать базовый класс страниц, где вызов SetHasNavigationBar объединяется с вызовом кастомного PageRenderer на iOS. Это позволяет централизованно управлять отображением верхней панели, обеспечивая единый пользовательский опыт.
Дополнительно можно применять события Appearing и Disappearing страниц для динамического изменения видимости панели при навигации между страницами.
Проверка изменений и отладка скрытия Action Bar

Для подтверждения корректного скрытия Action Bar на Android и Navigation Bar на iOS используют следующие методы проверки и отладки:
- Запуск приложения на эмуляторе и реальном устройстве для проверки визуального состояния верхней панели.
- Использование Debug Output для отслеживания вызовов методов SetHasNavigationBar и SetNavigationBarHidden:
- Проверка темы Android в styles.xml на отсутствие Action Bar.
- Проверка подключенных кастомных PageRenderer на iOS и вызов методов ViewWillAppear и ViewWillDisappear.
System.Diagnostics.Debug.WriteLine(«Navigation Bar скрыт»);
Для систематической отладки рекомендуется:
- Добавлять логирование перед и после вызова скрытия панели.
- Использовать breakpoints в Visual Studio для контроля порядка выполнения методов на каждой платформе.
- Проверять поведение при переходах между страницами, чтобы убедиться в отсутствии непредвидимого отображения Action Bar.
- Сравнивать состояние интерфейса на устройствах с разными версиями Android и iOS для выявления платформенных особенностей.
Эти действия позволяют убедиться, что верхняя панель скрыта корректно и изменения применяются во всех сценариях навигации. Логирование и пошаговая отладка обеспечивают точное понимание работы методов скрытия Action Bar.
Вопрос-ответ:
Как убрать Action Bar в Xamarin.Android без потери функциональности меню?
Для скрытия стандартного Action Bar в Xamarin.Android измените тему приложения на Theme.AppCompat.Light.NoActionBar в файле styles.xml. Далее добавьте Toolbar в макет активности и подключите его через SetSupportActionBar(toolbar). Меню можно сохранить, создав ресурс menu.xml и обработав его в методе OnCreateOptionsMenu. Такой подход позволяет скрыть стандартную панель, сохранив элементы меню и кнопки.
Как скрыть Navigation Bar на iOS для одной страницы в Xamarin.Forms?
Для скрытия Navigation Bar на конкретной странице используйте вызов NavigationPage.SetHasNavigationBar(this, false) в конструкторе этой страницы. Это отключает верхнюю панель только для данной страницы, остальные страницы сохраняют стандартный Navigation Bar. Такой метод позволяет изолированно управлять интерфейсом без изменения глобальных настроек приложения.
Можно ли управлять верхней панелью одновременно на Android и iOS в Xamarin.Forms?
Да, совместное управление достигается через вызов NavigationPage.SetHasNavigationBar для всех страниц, где требуется скрыть панель. На Android дополнительно нужно выбрать тему без Action Bar, а на iOS при необходимости применить кастомный PageRenderer для точного контроля. Такой подход обеспечивает единообразное отображение интерфейса на обеих платформах.
Для чего применяются кастомные PageRenderer на iOS при скрытии Navigation Bar?
Кастомные PageRenderer позволяют программно управлять Navigation Bar, изменять его видимость, цвет фона и отображение тени. Переопределяя методы ViewWillAppear и ViewWillDisappear, можно скрывать верхнюю панель динамически при переходах между страницами. Этот способ дает гибкий контроль над интерфейсом без изменения основного кода Xamarin.Forms.
Какие методы проверки используют для контроля скрытия Action Bar в Xamarin?
Для проверки изменений используют запуск на эмуляторе и реальном устройстве, логирование через Debug.WriteLine, просмотр вызова методов SetHasNavigationBar и SetNavigationBarHidden, а также breakpoints в Visual Studio. Проверяют корректность отображения при переходах между страницами и на разных версиях Android и iOS, чтобы убедиться в стабильности работы скрытия панели.
Как полностью убрать Action Bar в Xamarin.Android без влияния на меню и кнопки?
Для полного скрытия стандартного Action Bar измените тему приложения на Theme.AppCompat.Light.NoActionBar в styles.xml. После этого создайте Toolbar в макете активности и подключите его через SetSupportActionBar(toolbar). Элементы меню остаются доступными через ресурс menu.xml и метод OnCreateOptionsMenu. Такой подход убирает верхнюю панель без потери функциональности интерфейса.
Как скрыть Navigation Bar на iOS для нескольких страниц в Xamarin.Forms?
Чтобы отключить Navigation Bar на нескольких страницах, вызывайте NavigationPage.SetHasNavigationBar(this, false) в конструкторе каждой нужной страницы. Для точного контроля на iOS можно использовать кастомный PageRenderer, где в методе ViewWillAppear вызывается NavigationController.SetNavigationBarHidden(true, false). Это позволяет централизованно управлять отображением верхней панели и поддерживать одинаковое поведение при переходах между страницами.
