Я хочу, чтобы приложение отображало только строку состояния, а панель навигации находилась в режиме IMMERSIVE_STICKY. Перепробовал много вещей, но каким-то образом панель навигации остается, а строка состояния скрыта. Может ли материальная тема мешать полноэкранным функциям?
Пробовал другой вопрос, связанный с той же проблемой, но они решают проблему в формах хаков, а также версия API устарела для решений. Вот мой атрибут темы и соответствующий код установки:
<style name = "AppTheme" parent = "android:Theme.Material.Light.NoActionBar">
<item name = "windowActionBar">false</item>
<item name = "android:windowFullscreen">true</item>
<item name = "android:windowContentOverlay">@null</item>```
Пытался получить supportActionBar, результат нулевой.
Когда вы говорите «панель навигации», вы имеете в виду созданную систему, которая появляется внизу с такими действиями, как «Назад», «Домой» и «Недавние»? Я неправильно истолковал это как навигационный ящик, поэтому я сосредоточился на панели действий (той, что сверху, прямо под строкой состояния).
Да. Нижний
1) С помощью кода вы можете скрыть панель действий, используя приведенный ниже способ.
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
supportActionBar?.hide()
}
}
Эта строка supportActionBar?.hide() скрывает только панель действий. См. прикрепленное изображение.
2) Через XML с темой
Во-первых, добавьте стиль в styles.xml:
<style name = "AppTheme.NoActionBar" parent = "Theme.AppCompat.Light.NoActionBar">
<item name = "windowActionBar">false</item>
<item name = "windowNoTitle">true</item>
AndroidManifest.xml и примените его к активности, для которой вы хотите скрыть панель действий.
<activity
android:name = ".MyActivity"
android:theme = "@style/AppTheme.NoActionBar"/>
Я хотел показать строку состояния и скрыть панель навигации. Ваш код скрывает панель действий. Не имеет отношения к вопросу.
Согласно документы здесь, вам нужно использовать SYSTEM_UI_FLAG_HIDE_NAVIGATION, чтобы скрыть нижнюю панель навигации. Они также передают флаг SYSTEM_UI_FLAG_FULLSCREEN, так как хорошей практикой является также скрытие строки состояния, когда панель навигации скрыта.
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
Если я правильно интерпретировал вопрос, ваше требование состоит в том, чтобы НЕ скрывать строку состояния и скрывать панель навигации. Таким образом, вы не должны передавать флаг полноэкранного режима где бы то ни было. Удалите его из приведенного выше фрагмента, а также удалите android:windowFullscreen из своей темы. Это должно заставить строку состояния выглядеть как обычно.
Таким образом, ваш настоящий uiOptions будет
int uiOptions = View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
Примечание: Как упоминалось в документах, IMMERSIVE_STICKY только гарантирует, что любое касание/жест в области панели навигации также передается в приложение. Он по-прежнему будет отображать полупрозрачную панель навигации, если пользователь проведет туда пальцем. Как упоминалось в другие ответы, полностью удалить его без какой-либо формы root-доступа невозможно.
Редактировать: Сначала я тестировал это с AppCompatActivity и темой по умолчанию Theme.AppCompat.Light.NoActionBar. Также протестировано с OP android:Theme.Material.Light.NoActionBar (что требует использования Activity вместо AppCompatActivity). Оба работали.
Я предполагаю, что ваш уровень API определенно выше Android 4.1, так как это было довольно давно.
Пробовал. Но это не работает. Я имею в виду, что если я использую флаг FULLSCREEN, он переходит в режим IMMERSIVE, но без него панель навигации видна.
И да, я не хочу скрывать это навсегда. По сути, я хочу поведение IMMERSIVE, но отображаю строку состояния.
Не могли бы вы указать свой минимальный уровень API? Потому что я сделал демонстрационное приложение с этим, и оно работает так, как вы хотите. Иммерсивный, как панель навигации, всегда видимая строка состояния. Попробуйте сами создать новое приложение и посмотрите, работает ли оно? Это будет означать, что что-то еще в вашем текущем приложении возится с ним.
minSdkVersion 21 Ага. Может быть что-то, что я добавил. Я использую несколько сторонних библиотек.
Он работает над новым проектом. Принятие вашего ответа. Постараюсь найти, что я сделал не так.
В новом проекте используется та же тема Material? Я только что заметил, что использую тему по умолчанию, а не ту, которую вы указали.
Неа. Стоковый
Отлично работает с темой Material и расширением FragmentActivity в новом приложении. Думаю, я что-то путаю.
windowFullscreenскрывает строку состояния, а темаNoActionBarдолжна скрывать системную панель действий даже без явногоwindowActionBar = false. Не могли бы вы проверить, добавляет ли макет пользовательскую панель инструментов в качестве панели действий?