Ukryj pasek stanu

Z tego lekcji dowiesz się, jak ukryć pasek stanu w różnych wersjach Androida. Ukrycie paska stanu (i opcjonalnie paska nawigacyjnego) sprawia, że treści zajmują więcej przestrzeni reklamowej, co zwiększa zaangażowanie użytkowników.

Rysunek 1 przedstawia aplikację z widocznym paskiem stanu:

paski systemowe

Rysunek 1. Widoczny pasek stanu.

Rysunek 2 przedstawia aplikację z ukrytym paskiem stanu. Pamiętaj, że pasek działań też jest ukryty. Pasek działań nigdy nie powinien być wyświetlany bez paska stanu.

paski systemowe

Rysunek 2. Ukryty pasek stanu.

Ukrywanie paska stanu w Androidzie 4.0 i jego starszych wersjach

Pasek stanu w Androidzie 4.0 (poziom interfejsu API 14) lub niższym możesz ukryć, ustawiając flagi WindowManager. Możesz to zrobić automatycznie lub ustawiając motyw aktywności w pliku manifestu aplikacji. Ustawienie motywu aktywności w pliku manifestu aplikacji jest preferowane, jeśli pasek stanu powinien być zawsze ukryty (chociaż, ściśle mówiąc, można go automatycznie zastąpić). Na przykład:

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

Zalety motywu aktywności:

  • Jest to łatwiejsze w obsłudze i mniej podatne na błędy niż automatyczne ustawianie flagi.
  • Zapewnia to płynniejsze przejścia w interfejsie, ponieważ system ma informacje niezbędne do wyrenderowania UI przed utworzeniem wystąpienia głównej aktywności aplikacji.

Flagi WindowManager można też ustawiać automatycznie. Ta metoda ułatwia ukrywanie i wyświetlanie paska stanu podczas interakcji użytkownika z aplikacją:

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);
    }
    ...
}

Gdy ustawisz flagi WindowManager (za pomocą motywu aktywności lub automatycznie), flagi będą działać, dopóki aplikacja ich nie usunie.

Możesz użyć FLAG_LAYOUT_IN_SCREEN, aby ustawić układ aktywności tak, aby używał tego samego obszaru ekranu, który jest dostępny po włączeniu FLAG_FULLSCREEN. Zapobiega to zmianie rozmiaru treści, gdy pasek stanu się ukrywa.

Ukrywanie paska stanu w Androidzie 4.1 i nowszych

Pasek stanu możesz ukryć w Androidzie 4.1 (poziom interfejsu API 16) i nowszych, używając funkcji setSystemUiVisibility(). setSystemUiVisibility() ustawia flagi interfejsu na poziomie poszczególnych widoków. Te ustawienia są agregowane na poziomie okna. Używanie funkcji setSystemUiVisibility() do ustawiania flag interfejsu zapewnia dokładniejszą kontrolę nad paskami systemowymi niż używanie flag WindowManager. Ten fragment kodu ukrywa pasek stanu:

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();

Uwaga:

  • Po wyczyszczeniu flag interfejsu (np. po opuszczeniu aktywności) aplikacja musi je zresetować, jeśli chcesz znowu je ukryć. Informacje o tym, jak nasłuchiwać zmian widoczności interfejsu, by aplikacja odpowiednio zareagowała, znajdziesz w artykule Reagowanie na zmiany widoczności interfejsu.
  • To, gdzie ustawisz flagi interfejsu, ma znaczenie. Jeśli ukryjesz paski systemowe w metodzie onCreate() aktywności, a użytkownik naciśnie przycisk ekranu głównego, paski systemowe pojawią się ponownie. Gdy użytkownik ponownie otworzy aktywność, wywołanie onCreate() nie będzie możliwe, więc paski systemowe pozostaną widoczne. Jeśli chcesz, aby interfejs systemu pozostawał utrzymywany w miarę przechodzenia przez użytkownika do Twojej aktywności i z niej wychodząc, ustaw flagi interfejsu w onResume() lub onWindowFocusChanged().
  • Metoda setSystemUiVisibility() działa tylko wtedy, gdy widok, z którego ją wywołujesz, jest widoczny.
  • Opuszczenie widoku powoduje wyczyszczenie flag ustawionych z polem setSystemUiVisibility().

Umieszczanie treści za paskiem stanu

W Androidzie 4.1 i nowszych zawartość aplikacji można ustawić tak, aby była widoczna za paskiem stanu, tak aby jej rozmiar nie zmieniał się wraz z ukryciem i wyświetleniem paska stanu. Aby to zrobić, użyj funkcji SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Może być też konieczne użycie SYSTEM_UI_FLAG_LAYOUT_STABLE, by utrzymać stabilny układ aplikacji.

W takim przypadku Twoim obowiązkiem jest dbanie o to, aby kluczowe części interfejsu użytkownika (np. wbudowane elementy sterujące aplikacji Mapy) nie wyświetlały się na paskach systemowych. Może to uniemożliwić korzystanie z Twojej aplikacji. W większości przypadków można sobie z tym poradzić, dodając do pliku układu XML atrybut android:fitsSystemWindows ustawiony na true. Spowoduje to dostosowanie dopełnienia elementu nadrzędnego ViewGroup, aby pozostawić miejsce na okna systemowe. W przypadku większości aplikacji to wystarczy.

W niektórych przypadkach może być jednak konieczne zmodyfikowanie domyślnego dopełnienia, by uzyskać pożądany układ aplikacji. Aby bezpośrednio manipulować układem treści względem pasków systemowych (zajmujących miejsce nazywane „wstawieniem treści” w oknie), zastąp element fitSystemWindows(Rect insets). Metoda fitSystemWindows() jest wywoływana przez hierarchię widoków danych po zmianie ustawień treści w danym oknie, aby umożliwić odpowiednie dostosowanie zawartości okna. Dzięki zastąpieniu tej metody możesz obsługiwać wstawki (a co za tym idzie – układ aplikacji) w dowolny sposób.