Android: показать/скрыть строку состояния/панель питания

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

Я вставил onCreate

getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

и в кнопках показать:

WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);

Спрятать:

WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);

Любые подсказки/советы?

//редактировать

Я видел эту подсказку здесь: http://android.serverbox.ch/?p=306 и изменил мой код следующим образом:

private void hideStatusBar() throws IOException, InterruptedException {
    Process proc = Runtime.getRuntime().exec(new String[]{"su","-c","service call activity 79 s16 com.android.systemui"});
    proc.waitFor();
}

private void showStatusBar() throws IOException, InterruptedException {
    Process proc = Runtime.getRuntime().exec(new String[]{"am","startservice","-n","com.android.systemui/.SystemUIService"});
    proc.waitFor();
}

Поэтому, если я нажимаю на свои кнопки и вызываются методы, я вижу, что что-то происходит, потому что приложение ждет несколько секунд. Я также заглянул в LockCat и вижу, что что-то происходит.

показать: http://pastebin.com/CidTRSTi скрыть: http://pastebin.com/iPS6Kgbp


person B770    schedule 25.11.2011    source источник
comment
Пример stackoverflow.com/a/35886019/4395114   -  person Mansukh Ahir    schedule 09.03.2016


Ответы (8)


У вас есть полноэкранная тема, установленная в манифесте?

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

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

Я бы использовал следующее, чтобы добавить и удалить полноэкранный флаг:

// Hide status bar
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Show status bar
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
person Rob    schedule 25.11.2011
comment
Нет, я не добавил его в манифест. Но когда я пытаюсь, я получаю сообщение об ошибке: Ошибка: не найден ресурс, соответствующий данному имени (в «теме» со значением «@android:style/Theme.Dark.NoTitleBar.Fullscreen»). - person B770; 25.11.2011
comment
@ B770: нет имени Theme.Dark.NoTitleBar.Fullscreen. Есть один по имени Theme.NoTitleBar.Fullscreen. Однако вы не можете избавиться от системной панели на устройствах Android 3.0+, на которых отсутствуют заэкранные кнопки ДОМОЙ и НАЗАД. - person CommonsWare; 25.11.2011
comment
@CommonWare: я нашел это: forum.xda-developers.com/showthread.php ?t=1265397 здесь можно скрыть и показать строку состояния. Я установил Overcome ROM, в который включена эта функция, и она работает. Вот я и подумал, что можно было бы поставить эту функцию и на другую кнопку... - person B770; 25.11.2011
comment
в порядке. Я понял. Я забыл предоставить права su приложению. Теперь все просто отлично работает :) - person B770; 06.12.2011
comment
Можно ли показать/скрыть строку состояния при прокрутке вверх или вниз? - person Zahra.HY; 21.08.2016
comment
@Rob, это работает нормально, одна проблема, с которой я сталкиваюсь, заключается в том, что когда я добавляю и очищаю, на несколько миллисекунд отображается белая строка состояния. который выглядит очень хорошо. Любое решение для этого? - person Nouman Ch; 27.04.2019

Для некоторых людей отображение строки состояния после очистки FLAG_FULLSCREEN может не работать,

Вот решение, которое сработало для меня (Документация) (Ссылка на флаг)

Скрыть строку состояния

// Hide Status Bar
if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
else {
   View decorView = getWindow().getDecorView();
  // Hide Status Bar.
   int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
   decorView.setSystemUiVisibility(uiOptions);
}

Показать строку состояния

   if (Build.VERSION.SDK_INT < 16) {
              getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    else {
       View decorView = getWindow().getDecorView();
      // Show Status Bar.
       int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
       decorView.setSystemUiVisibility(uiOptions);
    }
person Pradeep    schedule 03.08.2015
comment
У меня такой же точный код, но строка состояния все еще отображается - person Sanjeev; 20.10.2018

используется для kolin в android для скрытия строки состояния в kolin нет необходимости использовать точку с запятой (;) в конце строки

window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)

в android с использованием языка java для скрытия строки состояния

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
person Prabh deep    schedule 03.05.2019

Для пользователей Котлин

ПОКАЗАТЬ

activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)

СКРЫТЬ

activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)

person Muhamed Riyas M    schedule 13.02.2019

Я знаю, что это очень старый вопрос, но на всякий случай кто-нибудь приземлится здесь в поисках новейшего поддерживаемого способа программно скрыть строку состояния на ходу, вы можете сделать это следующим образом:

window.insetsController?.hide(WindowInsets.Type.statusBars())

и показать это снова:

window.insetsController?.show(WindowInsets.Type.statusBars())
person Kamran Ahmed    schedule 08.01.2021

с помощью этого метода, используя SYSTEM_UI_FLAG_IMMERSIVE_STICKY, полный экран возвращается одним нажатием без какой-либо реализации. Просто скопируйте этот метод ниже и вызовите его там, где вы хотите в своей деятельности. Подробнее здесь

private void hideSystemUI() {
    getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_IMMERSIVE
                    // Set the content to appear under the system bars so that the
                    // content doesn't resize when the system bars hide and show.
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    // Hide the nav bar and status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
}
person Nicoolasens    schedule 13.05.2019

Я пробовал так много вещей.

Наконец, это наиболее подходящий код для скрытия и отображения полноэкранного режима.

private fun hideSystemUi() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.setDecorFitsSystemWindows(true)
    } else {
        // hide status bar
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.decorView.systemUiVisibility =
            View.SYSTEM_UI_FLAG_IMMERSIVE or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    }

}

private fun showSystemUi() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.setDecorFitsSystemWindows(false)
    } else {
        // Show status bar
        window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.decorView.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_STABLE
    }

}

Это реализовано в этом приложении: Разбивка Android.

Перейдите в раздел Видео (нижняя панель) > Воспроизвести любое видео > Включить полноэкранный режим.

person Mayank Sharma    schedule 15.11.2020

Ссылка — https://developer.android.com/training/system-ui/immersive.html

// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
person Varun Bhatia    schedule 31.08.2016