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 o conteúdo ocupe mais espaço de exibição, proporcionando uma experiência de 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

Para ocultar a barra de status no Android 4.0 (API de nível 14) e em versões anteriores, WindowManager. Você pode fazer isso de forma programática ou a definição de um tema de atividade no arquivo de manifesto do app. A definição de um tema de atividade no arquivo de manifesto é a abordagem preferida se a barra de status deve permanecer sempre ocultas em seu aplicativo (embora seja possível substituir de forma programática as se você 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.
  • Isso resulta em transições de interface mais suaves, 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 seu 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 sinalizações WindowManager, seja por um tema de atividade ou programaticamente), as sinalizações permanecem em vigor, a menos que sejam apagadas pelo aplicativo.

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

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

Para ocultar a barra de status no Android 4.1 (API de nível 16) e versões mais recentes, usando setSystemUiVisibility(). setSystemUiVisibility() define sinalizações de IU em o nível da vista individual essas configurações são agregadas ao nível da janela. Usando setSystemUiVisibility() para definir sinalizações de interface oferece controle mais granular sobre as barras do sistema do que usar 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 do usuário forem apagadas (por exemplo, navegando para fora do atividade), o app precisará redefini-las para ocultar as barras novamente. Consulte Como responder a alterações de visibilidade da IU para obter uma discussão sobre como detectar alterações de visibilidade da IU para que seu aplicativo possa responder de acordo.
  • Onde você define as sinalizações da IU faz toda a diferença. Se você ocultar as barras de sistema na função onCreate() e o usuário pressionar Home, as barras do sistema serão reaparecer. Quando o usuário reabre a atividade, onCreate() não será chamado, então as barras do sistema permanecerão visíveis. Se você quiser que a interface do sistema mude para persistem enquanto o usuário navega para dentro e para fora da sua atividade, defina flags de interface onResume() ou onWindowFocusChanged().
  • O método setSystemUiVisibility() só tem efeito se a visualização a partir da qual você chamá-lo estiver visível.
  • Navegar para fora da visualização causa flags definido com setSystemUiVisibility() que será apagado.

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

No Android 4.1 e superior, é possível configurar o conteúdo do seu aplicativo para que apareça atrás a barra de status, para que o conteúdo não seja redimensionado conforme a barra de status é ocultada e exibida. Para fazer isso, use SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN: Talvez também seja necessário usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ajudar seu app a manter um layout estável.

Ao usar essa abordagem, torna-se sua responsabilidade garantir que as partes essenciais da interface do usuário do seu aplicativo (por exemplo, os controles integrados em um aplicativo do Google Maps) não acabam sendo cobertas pelas barras de sistema. Isso pode deixar seu app inutilizável. Na maioria dos casos, é possível processe isso adicionando o atributo android:fitsSystemWindows ao seu 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 resultado para seu app. Para manipular diretamente a forma como seus distribuição do conteúdo em relação às barras do sistema, que ocupam um espaço conhecido como "encartes de conteúdo"), substitua fitSystemWindows(Rect insets). O método fitSystemWindows() é chamado pelo hierarquia de visualização quando os encartes de conteúdo de uma janela são alterados, para permitir que a janela ajustar seu conteúdo de acordo. Ao substituir esse método, você pode lidar com o encartes (e, portanto, o layout do app) como você quiser.