قيود على اتجاه التطبيق على الهواتف ولكن ليس على الشاشات الكبيرة

رمز التقييم بنجمتين

يعمل تطبيقك بشكلٍ رائع على الهواتف في الوضع العمودي، لذا قصرت استخدامه على هذا الوضع فقط. ولكنك ترى فرصة لتحسين أدائه على الشاشات الكبيرة في الوضع الأفقي.

كيف يمكنك تحقيق كلا الأمرين، أي قصر استخدام التطبيق على الوضع العمودي على الشاشات الصغيرة، ولكن تفعيل الوضع الأفقي على الشاشات الكبيرة؟

أفضل الممارسات

تحترم أفضل التطبيقات الإعدادات المفضّلة للمستخدم، مثل اتجاه الجهاز.

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

هذه الوصفة هي إجراء مؤقت، وهي تتيح دعم الشاشات الكبيرة بشكلٍ جزئي. استخدِم الوصفة إلى أن تتمكّن من تحسين تطبيقك لتقديم دعم كامل لجميع إعدادات الأجهزة.

المكوّنات

  • screenOrientation: إعداد في بيان التطبيق يتيح لك تحديد كيفية استجابة تطبيقك لتغييرات اتجاه الجهاز
  • Activity#setRequestedOrientation(): طريقة يمكنك من خلالها تغيير اتجاه التطبيق في وقت التشغيل
  • LocalConfiguration: موفّر محلي قابل للإنشاء يعرض الحالي للجهاز Configuration، ما يتيح لك قراءة أبعاد الشاشة بوحدات بكسل مستقلة الكثافة (DP)
  • LaunchedEffect: واجهة برمجة تطبيقات تأثير جانبي في Compose تُشغّل مجموعة من الرموز البرمجية عند تغيير مفتاح (في هذه الحالة، عند تغيير الإعدادات)

الخطوات

فعِّل التطبيق للتعامل مع تغييرات الاتجاه تلقائيًا في بيان التطبيق. بعد ذلك، في وقت التشغيل، استخدِم Jetpack Compose لقصر الاتجاه ديناميكيًا على الوضع العمودي على الشاشات الصغيرة (الهواتف) مع السماح بجميع الاتجاهات على الشاشات الكبيرة.

‫1. حدِّد إعداد الاتجاه في بيان التطبيق

يمكنك إما تجنُّب الإعلان عن العنصر screenOrientation في بيان التطبيق (وفي هذه الحالة، يتم ضبط الاتجاه تلقائيًا على unspecified) أو ضبط اتجاه الشاشة على fullUser. إذا لم يسبق للمستخدم قفل التدوير المستند إلى المستشعر، سيتوافق تطبيقك مع جميع اتجاهات الجهاز.

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

الفرق بين استخدام unspecified وfullUser بسيط ولكنه مهم. إذا لم تعلن عن قيمة screenOrientation، يختار النظام الاتجاه، وقد تختلف السياسة التي يستخدمها النظام لتحديد الاتجاه من جهاز إلى آخر. من ناحية أخرى، يتطابق تحديد fullUser بشكلٍ أوثق مع السلوك الذي حدّده المستخدم للجهاز: إذا سبق للمستخدم قفل التدوير المستند إلى المستشعر، يتّبع التطبيق الإعداد المفضّل للمستخدم، وإلا سيسمح النظام بأي من اتجاهات الشاشة الأربعة الممكنة (العمودي أو الأفقي أو العمودي المعكوس أو الأفقي المعكوس). راجِع android:screenOrientation.

‫2. قصر الاتجاه ديناميكيًا في Compose

في Jetpack Compose، يمكنك قراءة أبعاد الشاشة الحالية بوحدات بكسل مستقلة الكثافة (DP) بشكلٍ تفاعلي من LocalConfiguration.current واستخدام LaunchedEffect لتعديل اتجاه النشاط كلما تغيّرت الإعدادات.

إذا كان عرض الشاشة أو ارتفاعها أقل من 600dp (ما يتوافق مع نقطة التوقف المدمجة للهواتف)، قصِر الاتجاه على الوضع العمودي. وإلا، اسمح للنظام بتدوير التطبيق استنادًا إلى الإعداد المفضّل للمستخدم (unspecified أو fullUser).

إليك التنفيذ الكامل والقابل للتجميع:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

من خلال إضافة المنطق داخل كتلة LaunchedEffect(configuration)، يمكنك إلغاء إعداد الاتجاه بشكلٍ تفاعلي كلما تغيّرت إعدادات التطبيق، مثل تغيير حجم النشاط أو نقله بين شاشات العرض أو طي جهاز قابل للطي أو فتحه.

لمزيد من المعلومات حول الحالات التي تحدث فيها تغييرات الإعدادات والحالات التي تؤدي إلى إعادة إنشاء النشاط، يُرجى الرجوع إلى مقالة التعامل مع تغييرات الإعدادات.

النتائج

يجب أن يظل تطبيقك الآن في الوضع العمودي على الشاشات الصغيرة بغض النظر عن تدوير الجهاز. على الشاشات الكبيرة، يجب أن يتوافق التطبيق مع الوضعين الأفقي والعمودي.

مراجع إضافية

للحصول على مساعدة بشأن ترقية تطبيقك ليتوافق مع جميع إعدادات الأجهزة في كل الأوقات، يُرجى الاطّلاع على ما يلي: