إخفاء شريط الحالة

يوضّح هذا الدرس كيفية إخفاء شريط الحالة على إصدارات مختلفة من نظام التشغيل Android. يتيح إخفاء شريط الحالة (وشريط التنقل اختياريًا) استخدام المحتوى بشكل أكبر من مساحة الشاشة، ما يوفّر تجربة مستخدم أكثر شمولية.

يوضح الشكل 1 تطبيقًا بشريط حالة مرئي:

أشرطة النظام

الشكل 1. شريط الحالة مرئي.

يعرض الشكل 2 تطبيقًا مع شريط حالة مخفي. لاحظ أن شريط الإجراءات مخفي أيضًا. يجب ألا تعرض شريط الإجراءات مطلقًا بدون شريط الحالة.

أشرطة النظام

الشكل 2. شريط الحالة المخفي.

إخفاء شريط الحالة في نظام التشغيل Android 4.0 والإصدارات الأقدم

يمكنك إخفاء شريط الحالة على الإصدار Android 4.0 (المستوى 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 (المستوى 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 الرئيسي لترك مساحة لنوافذ النظام. وتُعدّ هذه الطريقة كافية لمعظم التطبيقات.

ومع ذلك، قد تحتاج في بعض الحالات إلى تعديل المساحة المتروكة التلقائية للحصول على التنسيق المطلوب لتطبيقك. لمعالجة كيفية تخطيط المحتوى الخاص بك بشكل مباشر بالنسبة إلى أشرطة النظام (التي تشغل مساحة تُعرف باسم "المشاركات الداخلية للمحتوى")، عليك إلغاء fitSystemWindows(Rect insets). يتم استدعاء طريقة fitSystemWindows() من خلال العرض الهرمي لطريقة العرض عند تغيير العناصر الداخلية للمحتوى، وذلك للسماح للنافذة بضبط محتواها وفقًا لذلك. من خلال تجاوز هذه الطريقة، يمكنك التعامل مع العناصر الداخلية (وبالتالي تخطيط تطبيقك) كيفما تريد.