إدارة لوحة المفاتيح القابلة للفصل

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

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

في جميع الحالات، يتم تخزين جميع البيانات ذات الصلة بلوحة المفاتيح في كائن Configuration. يحتوي الحقلان keyboard وkeyboardHidden في عنصر الإعدادات على معلومات حول نوع لوحة المفاتيح ومدى توفّرها.

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

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

يتطلب دعم لوحات المفاتيح الخارجية إجراء تغييرات في الإعدادات، والتي يمكنك إدارتها بإحدى طريقتين:

  1. اسمح للنظام بإعادة إنشاء النشاط الجاري، واهتم بإدارة حالة تطبيقك.
  2. إدارة تغيير الإعدادات بنفسك (لن تتم إعادة إنشاء النشاط):
    • الإعلان عن جميع قيم الإعدادات ذات الصلة بلوحة المفاتيح
    • إنشاء معالج لتغيير الإعدادات

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

في حالات خاصة، قد تحتاج إلى تغيير تنسيق تطبيقك عند توصيل لوحة مفاتيح خارجية أو فصلها، على سبيل المثال، لتوفير مساحة أكبر للأدوات أو نوافذ التعديل.

في Jetpack Compose، يمكنك التفاعل مع تغييرات إعدادات لوحة المفاتيح بطريقتَين:

  1. واجهة مستخدم تفاعلية: يمكنك قراءة حالة الإعدادات الحالية مباشرةً في الدوال المركّبة باستخدام LocalConfiguration.current. تتم إعادة تركيب واجهة المستخدم تلقائيًا للتكيّف مع الحالة الجديدة عند توصيل لوحة مفاتيح أو فصلها.
  2. Side-Effect Callback: Use a lifecycle-aware DisposableEffect to register a configuration change listener on the host Activity, which lets you trigger non-UI events (like logging or analytics) without recreating the activity or instantiating any dummy view elements.

المكوّنات

  • android:configChanges: سمة عنصر <activity> في بيان التطبيق يُعلم النظام بالتغييرات في الإعدادات التي يديرها التطبيق.
  • ‫LocalConfiguration: دالة مركّبة محلية تعرض Configuration الجهاز الحالي.
  • DisposableEffect: واجهة برمجة تطبيقات Compose ذات تأثير جانبي تُشغِّل مجموعة من الرموز البرمجية عندما تدخل دالة مركّبة إلى التكوين، وتُزيلها عندما تغادر.

الخطوات

يجب الإعلان عن السمة configChanges وإضافة القيم ذات الصلة بلوحة المفاتيح لمنع إعادة إنشاء النشاط. بعد ذلك، استخدِم LocalConfiguration.current لتعديل تنسيق الدالة المركّبة ديناميكيًا، أو سجِّل مستمعًا للإعدادات باستخدام DisposableEffect.

1. تعريف السمة configChanges

عدِّل العنصر <activity> في بيان التطبيق من خلال إضافة قيم keyboard|keyboardHidden إلى قائمة تغييرات الإعدادات المُدارة حاليًا:

<activity
      …
      android:configChanges="...|keyboard|keyboardHidden">

2. الاستجابة للتغييرات في إعدادات لوحة المفاتيح

للتعامل مع تغييرات الإعدادات في Jetpack Compose، استخدِم أحد الخيارات التالية بناءً على ما إذا كنت تعدّل واجهة المستخدم أو تنفّذ دالة استدعاء ذات تأثير جانبي:

  • الخيار "أ": واجهة مستخدم تفاعلية (يُنصح بها)

    قراءة نوع لوحة المفاتيح مباشرةً من LocalConfiguration.current عند توصيل لوحة مفاتيح خارجية أو فصلها، تتغيّر هذه القيمة، ويعيد Compose إنشاء واجهة المستخدم تلقائيًا.

    val configuration = LocalConfiguration.current
    val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY
    
    if (isPhysicalKeyboardAttached) {
        // Render layout optimized for physical keyboard
    } else {
        // Render default layout
    }

  • الخيار "ب": Side-Effect Listener

    إذا كنت بحاجة إلى تشغيل تأثير جانبي (مثل التسجيل أو تحديث قاعدة بيانات محلية أو تفعيل الإحصاءات) عند تغيير الإعدادات، استخدِم DisposableEffect لتسجيل مستمع لتغيير الإعدادات على المضيف ComponentActivity.

    val context = LocalActivity.current
    DisposableEffect(context) {
        val activity = context as? ComponentActivity
        val listener = Consumer<Configuration> { newConfig ->
            val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY
            // Trigger non-UI actions, analytics, etc.
        }
        activity?.addOnConfigurationChangedListener(listener)
        onDispose {
            activity?.removeOnConfigurationChangedListener(listener)
        }
    }

النتائج

سيستجيب تطبيقك الآن لتوصيل لوحة مفاتيح خارجية أو فصلها بدون إعادة إنشاء النشاط الجاري.

مراجع إضافية

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