Den här lektionen beskriver hur du döljer statusfältet i olika versioner av Android. Genom att dölja statusfältet (och eventuellt navigationsfältet) kan innehållet använda mer av bildskärmsutrymmet, vilket ger en mer uppslukande användarupplevelse.
Figur 1 visar en app med ett synligt statusfält:
Figur 1. Synligt statusfält.
Figur 2 visar en app med dolt statusfält. Observera att handlingsfältet också är dolt. Du bör aldrig visa handlingsfältet utan statusfältet.
Figur 2. Dolt statusfält.
Dölj statusfältet på Android 4.0 och lägre
Du kan dölja statusfältet på Android 4.0 (API-nivå 14) och lägre genom att ställa inWindowManager
flaggor. Du kan göra detta programmatiskt eller genom att ställa in ett aktivitetstema i appens manifestfil. Att ställa in ett aktivitetstema i appens manifestfil är det bästa tillvägagångssättet om statusfältet alltid ska förbli dolt i din app (även om du i strikt mening kan åsidosätta temat programmatiskt om du vill). Till exempel:
<application ... android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" > ...</application>
Fördelarna med att använda ett aktivitetstema är följande:
- Det är lättare att underhålla och mindre felbenäget än att ställa in en flagga programmatiskt.
- Det resulterar i smidigare övergångar i användargränssnittet eftersom systemet har den information som behövs för att rendera ditt användargränssnitt innan appens huvudaktivitet instansieras.
Alternativt kan du ställa in WindowManager
flaggor programmatiskt.Detta tillvägagångssätt gör det lättare att dölja och visa statusfältet när användaren interagerar med din 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); } ...}
När du ställer in WindowManager
-flaggor (oavsett om det sker genom ett aktivitetstema eller på ett programmerat sätt), förblir flaggorna i kraft såvida inte appen tar bort dem.
Du kan användaFLAG_LAYOUT_IN_SCREEN
för att ställa in aktivitetslayouten så att den använder samma skärmyta som är tillgänglig när du har aktiveratFLAG_FULLSCREEN
. Detta förhindrar att ditt innehåll ändrar storlek när statusfältet döljs och visas.
Mörka statusfältet på Android 4.1 och högre
Du kan dölja statusfältet på Android 4.1 (API-nivå 16) och högre genom att använda setSystemUiVisibility()
.setSystemUiVisibility()
ställer in UI-flaggor på den individuella vynsnivån; dessa inställningar aggregeras till fönstersnivån. Om du använder setSystemUiVisibility()
för att ställa in UI-flaggor får du mer detaljerad kontroll över systemfältet än om du använder WindowManager
-flaggor. Det här utdraget döljer statusfältet:
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();
Notera följande:
- När UI-flaggorna har rensats (t.ex. genom att du navigerar bort från aktiviteten) måste appen återställas om du vill dölja fälten igen.I avsnittet Svara på ändringar av UI-visibilitet finns en diskussion om hur du lyssnar på ändringar av UI-visibilitet så att din app kan svara i enlighet med detta.
- Det spelar roll var du ställer in UI-flaggorna. Om du döljer systemfältet i aktivitetens
onCreate()
metod och användaren trycker på Home kommer systemfältet att visas igen. När användaren öppnar aktiviteten igen kommeronCreate()
inte att anropas, så systemfältet förblir synligt. Om du vill att ändringar i systemets användargränssnitt ska kvarstå när användaren navigerar in och ut ur aktiviteten, ska du ställa in UI-flaggor ionResume()
elleronWindowFocusChanged()
. - Metoden
setSystemUiVisibility()
har bara effekt om vyn som du anropar den från är synlig. - Navigering bort från vyn gör att flaggor som satts med
setSystemUiVisibility()
rensas.
Få innehåll att visas bakom statusfältet
På Android 4.1 och senare kan du ställa in att programmets innehåll ska visas bakom statusfältet, så att innehållet inte ändrar storlek när statusfältet döljs och visas.För att göra detta använder duSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
.Du kan också behöva användaSYSTEM_UI_FLAG_LAYOUT_STABLE
för att hjälpa programmet att bibehålla en stabil layout.
När du använder det här tillvägagångssättet blir det ditt ansvar att se till att kritiska delar av programmets användargränssnitt (t.ex. de inbyggda kontrollerna i ett kartprogram) inte blir täckta av systemfältet. Detta kan göra din app obrukbar. I de flesta fall kan du hantera detta genom att lägga till attributet android:fitsSystemWindows
i din XML-layoutfil med inställningen true
. Detta justerar utfyllnaden för den överordnade ViewGroup
för att lämna utrymme för systemfönstren. Detta är tillräckligt för de flesta program.
I vissa fall kan du dock behöva ändra standardutfyllnaden för att få den önskade layouten för ditt program. Om du vill manipulera direkt hur ditt innehåll läggs ut i förhållande till systemfältet (som upptar ett utrymme som kallas ”content insets” i fönstret), åsidosätter du fitSystemWindows(Rect insets)
.Metoden fitSystemWindows()
anropas av visningshierarkin när content insets för ett fönster har ändrats, så att fönstret kan justera sitt innehåll i enlighet med detta. Genom att åsidosätta den här metoden kan du hantera insatserna (och därmed din apps layout) som du vill.