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

رمز تقييم بنجمتَين

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

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

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

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

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

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

المكوّنات

  • 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)، يمكنك إلغاء إعداد الاتجاه بشكل تفاعلي كلما تغيّرت إعدادات التطبيق، مثلاً عند تغيير حجم النشاط أو نقله بين الشاشات أو عند طي جهاز قابل للطي أو فتحه.

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

النتائج

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

مراجع إضافية

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