Отображать только строку состояния в Android?

Я хочу, чтобы приложение отображало только строку состояния, а панель навигации находилась в режиме 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>```
windowFullscreen скрывает строку состояния, а тема NoActionBar должна скрывать системную панель действий даже без явного windowActionBar = false. Не могли бы вы проверить, добавляет ли макет пользовательскую панель инструментов в качестве панели действий?
shriakhilc 14.06.2019 13:09

Пытался получить supportActionBar, результат нулевой.

Vishal 14.06.2019 13:19

Когда вы говорите «панель навигации», вы имеете в виду созданную систему, которая появляется внизу с такими действиями, как «Назад», «Домой» и «Недавние»? Я неправильно истолковал это как навигационный ящик, поэтому я сосредоточился на панели действий (той, что сверху, прямо под строкой состояния).

shriakhilc 14.06.2019 13:23

Да. Нижний

Vishal 14.06.2019 13:26
2
4
900
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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"/>

Я хотел показать строку состояния и скрыть панель навигации. Ваш код скрывает панель действий. Не имеет отношения к вопросу.

Vishal 14.06.2019 13:22
Ответ принят как подходящий

Согласно документы здесь, вам нужно использовать 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, так как это было довольно давно.

shriakhilc 14.06.2019 13:35

Пробовал. Но это не работает. Я имею в виду, что если я использую флаг FULLSCREEN, он переходит в режим IMMERSIVE, но без него панель навигации видна.

Vishal 14.06.2019 13:42

И да, я не хочу скрывать это навсегда. По сути, я хочу поведение IMMERSIVE, но отображаю строку состояния.

Vishal 14.06.2019 13:45

Не могли бы вы указать свой минимальный уровень API? Потому что я сделал демонстрационное приложение с этим, и оно работает так, как вы хотите. Иммерсивный, как панель навигации, всегда видимая строка состояния. Попробуйте сами создать новое приложение и посмотрите, работает ли оно? Это будет означать, что что-то еще в вашем текущем приложении возится с ним.

shriakhilc 14.06.2019 13:51
minSdkVersion 21 Ага. Может быть что-то, что я добавил. Я использую несколько сторонних библиотек.
Vishal 14.06.2019 13:53

Он работает над новым проектом. Принятие вашего ответа. Постараюсь найти, что я сделал не так.

Vishal 14.06.2019 13:57

В новом проекте используется та же тема Material? Я только что заметил, что использую тему по умолчанию, а не ту, которую вы указали.

shriakhilc 14.06.2019 13:58

Неа. Стоковый

Vishal 14.06.2019 13:58

Отлично работает с темой Material и расширением FragmentActivity в новом приложении. Думаю, я что-то путаю.

Vishal 14.06.2019 14:11

Другие вопросы по теме