يعمل تطبيقك بشكلٍ رائع على الهواتف في الوضع العمودي، لذا حصرت استخدامه في هذا الوضع فقط. ولكنك ترى فرصة لتحسين أدائه على الشاشات الكبيرة في الوضع الأفقي.
كيف يمكنك تحقيق كلا الأمرين، أي حصر استخدام التطبيق في الوضع العمودي على الشاشات الصغيرة، ولكن تفعيل الوضع الأفقي على الشاشات الكبيرة؟
أفضل الممارسات
تحترم أفضل التطبيقات الإعدادات المفضّلة للمستخدم، مثل اتجاه الجهاز.
تنصح إرشادات جودة التطبيقات المتجاوبة بأن تتوافق التطبيقات مع جميع إعدادات الأجهزة ، بما في ذلك الوضعان العمودي والأفقي ووضع النوافذ المتعدّدة وحالتا الطي والفتح للأجهزة القابلة للطي. يجب أن تحسّن التطبيقات التنسيقات وواجهات المستخدم للإعدادات المختلفة، وأن تحفظ الحالة وتستعيدها أثناء تغيير الإعدادات.
هذه الوصفة هي إجراء مؤقت، وهي تتيح دعم الشاشات الكبيرة بشكلٍ جزئي. استخدِم الوصفة إلى أن تتمكّن من تحسين تطبيقك لتقديم دعم كامل لجميع إعدادات الأجهزة.
المكوّنات
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)، يمكنك إلغاء إعداد الاتجاه بشكلٍ تفاعلي كلما تغيّرت إعدادات التطبيق، مثل تغيير حجم النشاط أو نقله بين شاشات العرض أو طي جهاز قابل للطي أو فتحه.
لمزيد من المعلومات حول الحالات التي تحدث فيها تغييرات الإعدادات والحالات التي تؤدي إلى إعادة إنشاء النشاط، يُرجى الرجوع إلى مقالة التعامل مع تغييرات الإعدادات.
النتائج
يجب أن يظل تطبيقك الآن في الوضع العمودي على الشاشات الصغيرة بغض النظر عن تدوير الجهاز. على الشاشات الكبيرة، يجب أن يتوافق التطبيق مع الوضعين الأفقي والعمودي.
مراجع إضافية
للحصول على مساعدة بشأن ترقية تطبيقك ليتوافق مع جميع إعدادات الأجهزة في كل الأوقات، يُرجى الاطّلاع على ما يلي: