Ocultar a barra de status

Esta lição descreve como ocultar a barra de status em diferentes versões do Android. Ocultar a barra de status (e, opcionalmente, a barra de navegação) permite que o conteúdo use mais espaço da tela, proporcionando uma experiência do usuário mais imersiva.

A Figura 1 mostra um app com uma barra de status visível:

barras do sistema

Figura 1. Barra de status visível.

A Figura 2 mostra um app com uma barra de status oculta. Observe que a barra de ação também está oculta. Nunca mostre a barra de ação sem a barra de status.

barras do sistema

Figura 2. Barra de status oculta.

Ocultar a barra de status no Android 4.0 e em versões anteriores

Você pode ocultar a barra de status no Android 4.0 (API de nível 14) e em versões anteriores definindo sinalizações WindowManager. Faça isso programaticamente ou definindo um tema de atividade no arquivo de manifesto do seu app. Definir um tema de atividade no arquivo de manifesto do seu app é a melhor abordagem se a barra de status precisar permanecer sempre oculta no seu app, embora você possa modificar o tema programaticamente se quiser. Exemplo:

    <application
        ...
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
        ...
    </application>
    

As vantagens de usar um tema de atividade são as seguintes:

  • É mais fácil de manter e menos propenso a erros do que definir uma sinalização programaticamente.
  • Resulta em transições mais suaves da IU, já que o sistema tem as informações necessárias para renderizá-la antes de instanciar a atividade principal do app.

Como alternativa, você pode definir programaticamente as sinalizações WindowManager. Essa abordagem facilita ocultar e mostrar a barra de status à medida que o usuário interage com o app.

Kotlin

    class MainActivity : Activity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // If the Android version is lower than Jellybean, use this call to hide
            // the status bar.
            if (Build.VERSION.SDK_INT < 16) {
                window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN)
            }
            setContentView(R.layout.activity_main)
        }
        ...
    }
    

Java

    public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // If the Android version is lower than Jellybean, use this call to hide
            // the status bar.
            if (Build.VERSION.SDK_INT < 16) {
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
            }
            setContentView(R.layout.activity_main);
        }
        ...
    }
    

Quando você define as sinalizações WindowManager, seja por meio de um tema de atividade ou programaticamente, elas permanecem em vigor até que sejam apagadas pelo seu app.

Você pode usar FLAG_LAYOUT_IN_SCREEN para definir o layout de atividade para usar a mesma área de tela disponível quando você ativou FLAG_FULLSCREEN. Isso impede que seu conteúdo seja redimensionado quando a barra de status for ocultada e exibida.

Ocultar a barra de status no Android 4.1 e em versões posteriores

Você pode ocultar a barra de status no Android 4.1 (API de nível 16) e em versões posteriores usando setSystemUiVisibility(). O setSystemUiVisibility() define sinalizações de IU no nível da visualização individual. Essas configurações são agregadas ao nível da janela. O uso de setSystemUiVisibility() para definir sinalizações da IU oferece um controle mais granular sobre as barras do sistema do que as sinalizações WindowManager. Este snippet oculta a barra de status:

Kotlin

    // Hide the status bar.
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    actionBar?.hide()
    

Java

    View decorView = getWindow().getDecorView();
    // Hide the status bar.
    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);
    // Remember that you should never show the action bar if the
    // status bar is hidden, so hide that too if necessary.
    ActionBar actionBar = getActionBar();
    actionBar.hide();
    

Observe o seguinte:

  • Depois que as sinalizações da IU tiverem sido apagadas (por exemplo, ao navegar para longe da atividade), seu app precisará redefini-las para ocultar as barras mais uma vez. Consulte Responder a alterações de visibilidade da IU para uma discussão sobre como detectar alterações de visibilidade na IU para que seu app possa responder de forma adequada.
  • Onde você define as sinalizações da IU faz toda a diferença. Se você ocultar as barras de sistema no método onCreate() da sua atividade e o usuário pressionar "Início", as barras do sistema reaparecerão. Quando o usuário reabrir a atividade, onCreate() não será chamado, então as barras do sistema permanecerão visíveis. Se você quiser que as alterações na IU do sistema permaneçam à medida que o usuário navegar para dentro e para fora da sua atividade, defina sinalizações de IU em onResume() ou onWindowFocusChanged().
  • O método setSystemUiVisibility() só tem efeito se a visualização chamada estiver visível.
  • Navegar para fora da visualização faz com que as sinalizações definidas com setSystemUiVisibility() sejam apagadas.

Fazer o conteúdo aparecer por trás da barra de status

No Android 4.1 e versões posteriores, é possível definir que o conteúdo do aplicativo apareça por trás da barra de status. Assim, ele não precisa ser redimensionado conforme a barra de status é ocultada ou exibida. Para isso, use SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Você também pode precisar usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ajudar o app a manter um layout estável.

Quando você usa essa abordagem, é sua responsabilidade garantir que partes essenciais da IU do app (como controle integrados em um aplicativo de mapa) não sejam cobertas pelas barras do sistema. Isso pode deixar seu app inutilizável. Na maioria dos casos, você pode lidar com isso adicionando o atributo android:fitsSystemWindows ao arquivo de layout XML, definido como true. Isso ajusta o padding do ViewGroup pai para deixar espaço para as janelas do sistema e é suficiente para a maioria dos aplicativos.

Em alguns casos, no entanto, pode ser necessário modificar o padding padrão para conseguir o layout desejado para seu app. Para manipular diretamente a forma como o conteúdo é apresentado em relação às barras do sistema (que ocupam um espaço conhecido como "inserções de conteúdo" da janela), modifique fitSystemWindows(Rect insets). O método fitSystemWindows() é chamado pela hierarquia de visualização quando as inserções de conteúdo de uma janela são alteradas, para permitir que a janela ajuste o conteúdo de acordo com o necessário. Ao modificar esse método, você pode manipular as inserções (e, portanto, o layout do app) da maneira que quiser.