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 de exibição, 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 (nível 14 da API) e versões anteriores definindo flags WindowManager. Isso pode ser feito de maneira programática ou configurando um tema de atividade no arquivo de manifesto do app. Definir um tema de atividade no arquivo de manifesto do seu app é a abordagem preferencial caso a barra de status precise permanecer oculta no app. No entanto, você pode substituir programaticamente o tema se quiser. Por 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.
  • Isso resulta em transições mais suaves da interface, porque o sistema tem as informações necessárias para renderizar a interface 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 um tema de atividade ou de maneira programática), elas permanecem em vigor até que sejam apagadas pelo app.

Você pode usar FLAG_LAYOUT_IN_SCREEN para definir o layout da atividade para usar a mesma área de tela disponível quando você ativou FLAG_FULLSCREEN. Isso evita que o 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 mais recentes

Você pode ocultar a barra de status no Android 4.1 (API de nível 16) e versões mais recentes usando setSystemUiVisibility(). O setSystemUiVisibility() define sinalizações de interface 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 de interface oferece um controle mais granular sobre as barras do sistema do que o uso de flags 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 interface forem apagadas (por exemplo, ao sair da atividade), seu app vai precisar redefini-las se você quiser ocultar as barras novamente. Consulte Responder a mudanças de visibilidade da IU para ver uma discussão sobre como detectar mudanças de visibilidade da IU para que seu app possa responder de maneira 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 mudanças na IU do sistema persistam enquanto o usuário entra e sai da atividade, defina sinalizações de interface 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 flags definidas com setSystemUiVisibility() sejam apagadas.

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

No Android 4.1 e versões mais recentes, é possível definir que o conteúdo do aplicativo apareça por trás da barra de status para que ele não seja redimensionado conforme a barra é ocultada e exibida. Para fazer isso, use SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Também pode ser necessário usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ajudar o app a manter um layout estável.

Ao usar essa abordagem, é sua responsabilidade garantir que partes essenciais da IU do app (por exemplo, os controles integrados em um aplicativo do Maps) não sejam cobertas pelas barras do sistema. Isso pode deixar seu app inutilizável. Na maioria dos casos, você pode processar 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.

No entanto, em alguns casos, pode ser necessário modificar o padding padrão para conseguir o layout desejado para o 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 "encartes de conteúdo da janela", modifique fitSystemWindows(Rect insets). O método fitSystemWindows() é chamado pela hierarquia de visualização quando os encartes de conteúdo de uma janela mudam, para permitir que a janela ajuste o conteúdo. Ao modificar esse método, você pode processar os encartes (e, portanto, o layout do app) como quiser.