הסתרת שורת הסטטוס

בשיעור הזה מתואר איך להסתיר את שורת הסטטוס בגרסאות שונות של Android. הסתרת שורת הסטטוס (ואופציונלית, גם סרגל הניווט) מאפשרת התוכן משתמש בחלק גדול יותר משטח התצוגה, ובכך מספק חוויית משתמש סוחפת יותר.

באיור 1 מוצגת אפליקציה עם שורת סטטוס גלויה:

פסי מערכת

איור 1. שורת סטטוס גלויה.

באיור 2 מוצגת אפליקציה עם שורת סטטוס מוסתרת. חשוב לזכור שגם סרגל הפעולות מוסתר. אסור להציג את סרגל הפעולות בלי שורת הסטטוס.

פסי מערכת

איור 2. שורת סטטוס מוסתרת.

הסתרת שורת הסטטוס ב-Android 4.0 ובגרסאות קודמות

אפשר להסתיר את שורת הסטטוס ב-Android 4.0 (API ברמה 14) ומטה באמצעות ההגדרה WindowManager דגלים. אפשר לעשות זאת באופן פרוגרמטי או על ידי: הגדרת נושא פעילות בקובץ המניפסט של האפליקציה. הגדרה של עיצוב פעילות באפליקציה אם שורת הסטטוס צריכה להישאר תמיד, קובץ המניפסט הוא הגישה המועדפת מוסתרים באפליקציה (אם כי במילים אחרות, תוכלו לעקוף את המדיניות באופן פרוגרמטי נושא, אם רוצים). לדוגמה:

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

אלה היתרונות של שימוש בנושא פעילות:

  • קל יותר לתחזק את המכשיר ופחות שגיאות מאשר להגדיר דגל באופן פרוגרמטי.
  • התוצאה היא מעבר חלק יותר בממשק המשתמש, כי למערכת יש את המידע שהיא צריכה כדי לעבד את ממשק המשתמש לפני יצירת הפעילות הראשית של האפליקציה.

לחלופין, אפשר להגדיר באופן פרוגרמטי דגלי WindowManager. בצורה הזו קל יותר להסתיר ולהציג את שורת הסטטוס בזמן שהמשתמש מקיים אינטראקציה איתה האפליקציה שלך:

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

כשמגדירים דגלים מסוג WindowManager (באמצעות נושא של פעילות או באופן פרוגרמטי), הדגלים יישארו בתוקף אלא אם האפליקציה תנקה אותם.

אפשר להשתמש FLAG_LAYOUT_IN_SCREEN כדי להגדיר את פריסת הפעילות כך שתשתמש באותו אזור מסך שזמין לאחר הפעלת FLAG_FULLSCREEN. הפעולה הזו מונעת תוכן משינוי הגודל כששורת הסטטוס מוסתרת ומוצגת.

הסתרת שורת הסטטוס ב-Android מגרסה 4.1 ואילך

ניתן להסתיר את שורת הסטטוס ב-Android 4.1 (API ברמה 16) ואילך על ידי באמצעות setSystemUiVisibility(). ערכי הדגלים של ממשק המשתמש נקבעים על ידי setSystemUiVisibility() כ- רמת הצפייה הבודדת; ההגדרות האלה מצטברות ברמת החלון. באמצעות setSystemUiVisibility() כדי להגדיר דגלים בממשק המשתמש מספקת שליטה פרטנית יותר על סרגלי המערכת מאשר על השימוש WindowManager דגלים. קטע הקוד הזה מסתיר את שורת הסטטוס:

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

שימו לב:

  • לאחר ניקוי הדגלים בממשק המשתמש (לדוגמה, על ידי ניווט אל מחוץ פעילות), האפליקציה צריכה לאפס אותם כדי להסתיר שוב את העמודות. במאמר תגובה לשינויים בחשיפה של ממשק המשתמש אפשר לקרוא דיון לגבי האופן שבו ניתן להאזין לשינויים בחשיפה של ממשק המשתמש, כדי שהאפליקציה תוכל מגיבים בהתאם.
  • יש הבדל בין הדגלים שבהם מגדירים את התכונות הניסיוניות בממשק המשתמש. אם הסתרת את סרגלי המערכת בקטע של הפעילות בשיטת onCreate() והמשתמש לוחץ על 'דף הבית', סרגלי המערכת להופיע שוב. כשהמשתמש פותח מחדש את הפעילות, onCreate() לא תתבצע קריאה, כך שעמודות המערכת יישארו גלויות. אם רוצים לבצע שינויים בממשק המשתמש של המערכת להמשיך כשהמשתמש מנווט לפעילות שלך ויוצא ממנה, להגדיר סימונים בממשק המשתמש onResume() או onWindowFocusChanged().
  • השיטה setSystemUiVisibility() משפיעה רק אם התצוגה שממנה מבצעים את הפעולה גלויה.
  • יציאה מהתצוגה תגרום לסימונים מוגדר עם setSystemUiVisibility() .

הצגת תוכן מאחורי סרגל הסטטוס

ב-Android 4.1 ואילך, ניתן להגדיר את תוכן האפליקציה כך שיופיע מאחורי הקלעים בשורת הסטטוס, כך שגודל התוכן לא ישתנה כששורת הסטטוס מוסתרת ומוצגת. כדי לעשות את זה משתמשים SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN יכול להיות שתצטרכו להשתמש גם SYSTEM_UI_FLAG_LAYOUT_STABLE כדי לעזור לאפליקציה לשמור על בפריסה יציבה.

כשאתם משתמשים בגישה הזו, באחריותכם לוודא כי חלקים קריטיים של ממשק המשתמש של האפליקציה (לדוגמה, הפקדים המובנים באפליקציה מפות Google) לא מגיעים מכוסים בסרגלי המערכת. כתוצאה מכך, יכול להיות שלא תהיה אפשרות להשתמש באפליקציה. ברוב המקרים אפשר כדי לפתור את הבעיה, צריך להוסיף את המאפיין android:fitsSystemWindows לקובץ פריסת ה-XML, שמוגדר true. הפעולה הזו מתאימה את המרווח הפנימי של תבנית ההורה ViewGroup כדי להשאיר מקום לחלונות המערכת. הוא מספיק עבור רוב האפליקציות.

עם זאת, במקרים מסוימים ייתכן שיהיה עליך לשנות את המרווח הפנימי המוגדר כברירת מחדל כדי לקבל הפריסה של האפליקציה. כדי לשנות באופן ישיר את האופן שבו התוכן נפרס ביחס לעמודי המערכת (שתופסים שטח שנקרא 'content insets'), לבטל את fitSystemWindows(Rect insets). לשיטה fitSystemWindows() קוראים את היררכיית התצוגה כששינויים בתוכן של חלון מסוים, כדי לאפשר לחלון לשנות את התוכן שלו בהתאם. על ידי עקיפת השיטה הזו, אפשר Insets (וכתוצאה מכך הפריסה של האפליקציה שלך) איך שרוצים.