توافق الإدخال على الشاشات الكبيرة

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

  • اختبار الدعم الأساسي للوحة المفاتيح مثل التنقل باستخدام مفتاح التبويب (Tab) ومفتاح السهم (Tab) وتأكيد إدخال نص المفتاح والتشغيل/الإيقاف المؤقت لمفتاح المسافة في تطبيقات الوسائط
  • أضف اختصارات لوحة المفاتيح القياسية حيثما ينطبق ذلك؛ على سبيل المثال، Ctrl + Z للتراجع وCtrl + S للحفظ
  • اختبار تفاعلات الماوس الأساسية بطريقة النقر بزر الماوس الأيمن للاطّلاع على قائمة السياقات، وتغييرات الرموز عند التمرير، وأحداث التمرير على عجلة الماوس أو لوحة اللمس في طرق العرض المخصّصة
  • اختبار أجهزة الإدخال الخاصة بالتطبيقات مثل قلم الشاشة لتطبيقات الرسم ووحدات التحكم في الألعاب ووحدات التحكم MIDI لتطبيقات الموسيقى
  • استخدام تقنية الإدخال المتقدّمة التي يمكن أن تُبرِز التطبيق في بيئات أجهزة الكمبيوتر المكتبي، مثل لوحة اللمس كأداة خافتة لتطبيقات DJ، والتقاط الماوس للألعاب، واختصارات لوحة مفاتيح شاملة للمستخدمين الذين يركّزون على لوحة المفاتيح

لوحة المفاتيح

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

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

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

Kotlin

yourView.isFocusable = true

Java

yourView.setFocusable(true);

يمكنك بدلاً من ذلك ضبط السمة focusable في ملف التنسيق:

android:focusable="true"

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

Kotlin

// Arrow keys
yourView.nextFocusLeftId = R.id.view_to_left
yourView.nextFocusRightId = R.id.view_to_right
yourView.nextFocusTopId = R.id.view_above
yourView.nextFocusBottomId = R.id.view_below

// Tab key
yourView.nextFocusForwardId = R.id.next_view

Java

// Arrow keys
yourView.setNextFocusLeftId(R.id.view_to_left);
yourView.setNextFocusRightId(R.id.view_to_left);
yourView.setNextFocusTopId(R.id.view_to_left);
yourView.setNextFocusBottomId(R.id.view_to_left);

// Tab key
yourView.setNextFocusForwardId(R.id.next_view);

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

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

ضغطات المفاتيح

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

ومن الأمثلة على ذلك تطبيقات المحادثة التي تستخدم مفتاح Enter لإرسال رسالة، وتطبيقات الوسائط التي تعمل ويتوقف تشغيلها باستخدام مفتاح المسافة، والألعاب التي تتحكّم في الحركة باستخدام المفاتيح w وa وs وd.

تلغي معظم التطبيقات استدعاء onKeyUp() وتضيف السلوك المتوقع لكل رمز مفتاح تم تلقّيه، كما هو موضّح أدناه:

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
    return when (keyCode) {
        KeyEvent.KEYCODE_ENTER -> {
            sendChatMessage()
            true
        }
        KeyEvent.KEYCODE_SPACE -> {
            playOrPauseMedia()
            true
        }
        else -> super.onKeyUp(keyCode, event)
    }
}

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER) {
        sendMessage();
        return true;
    } else if (KeyEvent.KEYCODE_SPACE){
        playOrPauseMedia();
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}

يقع حدث onKeyUp عند تحرير مفتاح. يؤدي استخدام ميزة معاودة الاتصال هذه إلى منع التطبيقات من الحاجة إلى معالجة أحداث onKeyDown متعددة في حال الضغط باستمرار على أحد المفاتيح أو تحريره ببطء. بإمكان الألعاب والتطبيقات التي تريد معرفة لحظة الضغط على أحد المفاتيح أو التي تتوقع أن يضغط المستخدمون باستمرار على مفاتيح لوحة المفاتيح البحث عن حدث onKeyDown() والتعامل مع أحداث onKeyDown المتكررة بأنفسهم.

لمزيد من المعلومات حول توفير إمكانية استخدام لوحة المفاتيح، يمكنك الاطّلاع على التعامل مع إجراءات لوحة المفاتيح.

الاختصارات

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

تشمل بعض الاختصارات الشائعة Ctrl + S (حفظ) وCtrl + Z (تراجع) وCtrl + Shift + Z (إعادة). للاطّلاع على مثال حول بعض الاختصارات الأكثر تقدّمًا، يمكنك مراجعة قائمة مفاتيح اختصارات VLC Media Player.

يمكن تنفيذ الاختصارات باستخدام dispatchKeyShortcutEvent(). يعترض ذلك جميع تركيبات المفاتيح الوصفية (Alt وCtrl وShift) لرمز مفتاح معيّن. للتحقّق من مفتاح وصفي محدّد، يمكنك استخدام KeyEvent.isCtrlPressed() أو KeyEvent.isShiftPressed() أو KeyEvent.isAltPressed() أو KeyEvent.hasModifiers().

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

Kotlin

override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
  return when (event.keyCode) {
    KeyEvent.KEYCODE_O -> {
      openFile() // Ctrl+O, Shift+O, Alt+O
      true
    }
    KeyEvent.KEYCODE_Z-> {
      if (event.isCtrlPressed) {
        if (event.isShiftPressed) {
          redoLastAction() // Ctrl+Shift+Z pressed
          true
        } else {
          undoLastAction() // Ctrl+Z pressed
          true
        }
      }
    }
    else -> {
      return super.dispatchKeyShortcutEvent(event)
    }
  }
}

Java

@Override
public boolean dispatchKeyShortcutEvent(KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_O) {
      openFile(); // Ctrl+O, Shift+O, Alt+O
      return true;
  } else if(event.getKeyCode() == KeyEvent.KEYCODE_Z) {
      if (event.isCtrlPressed()) {
          if (event.isShiftPressed()) {
              redoLastAction();
              return true;
          }
          else {
              undoLastAction();
              return true;
          }
      }
  }
  return super.dispatchKeyShortcutEvent(event);
}

يمكنك أيضًا تنفيذ الاختصارات في onKeyUp() من خلال البحث عن KeyEvent.isCtrlPressed() أو KeyEvent.isShiftPressed() أو KeyEvent.isAltPressed() بالطريقة المذكورة أعلاه. قد يكون من الأسهل الحفاظ على هذا إذا كان السلوك التعريفي تعديلاً في سلوك التطبيق أكثر من مجرد تعديل. على سبيل المثال، عندما تعني W "السير إلى الأمام" ويعني Shift + W "تشغيل للأمام".

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  return when(keyCode) {
    KeyEvent.KEYCODE_W-> {
      if (event.isShiftPressed) {
        if (event.isCtrlPressed) {
          flyForward() // Ctrl+Shift+W pressed
          true
        } else {
          runForward() // Shift+W pressed
          true
        }
      } else {
        walkForward() // W pressed
        true
      }
    }
    else -> super.onKeyUp(keyCode, event)
  }
}

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_W) {
        if (event.isShiftPressed()) {
            if (event.isCtrlPressed()) {
                flyForward(); // Ctrl+Shift+W pressed
                return true;
            } else {
                runForward(); // Shift+W pressed
                return true;
            }
        } else {
            walkForward();
            return true;
        }
    }
    return super.onKeyUp(keyCode, event);
}

قلم الشاشة

تأتي العديد من الأجهزة ذات الشاشات الكبيرة بقلم شاشة، وتتعامل تطبيقات Android مع ذلك كإدخال على شاشة تعمل باللمس. قد تحتوي بعض الأجهزة أيضًا على جدول رسم USB أو بلوتوث، مثل Wacom Intuos. يمكن لتطبيقات Android تلقّي إدخال البلوتوث، ولكنها لن تعمل مع إدخال USB.

يتم الإبلاغ عن حدث قلم الشاشة كحدث شاشة تعمل باللمس من خلال View.onTouchEvent() أو View.onGenericMotionEvent()، ويحتوي على MotionEvent.getSource() من النوع SOURCE_STYLUS.

سيحتوي MotionEvent أيضًا على بيانات إضافية:

النقاط التاريخية

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

  • MotionEvent.getHistoricalX()
  • MotionEvent.getHistoricalY()
  • MotionEvent.getHistoricalPressure()
  • MotionEvent.getHistoricalAxisValue()

راحة اليد

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

يلغي Android أحداث لمس راحة اليد من خلال إرسال MotionEvent. إذا تلقّى تطبيقك ACTION_CANCEL، عليك إلغاء الإيماءة. إذا كان تطبيقك يتلقّى العلامة ACTION_POINTER_UP، تحقَّق مما إذا تم ضبط FLAG_CANCELED. إذا كان الأمر كذلك، فألغ الإيماءة.

لا تبحث عن FLAG_CANCELED فقط. بدايةً من الإصدار Android 13، يضبط النظام FLAG_CANCELED لأحداث ACTION_CANCEL، لكنّه لا يضبط في الإصدارات السابقة.

Android 12

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

Android 13

على Android 13 (المستوى 33 لواجهة برمجة التطبيقات) والإصدارات الأحدث، إذا كانت لمسة النخيل هي المؤشر الوحيد، يلغي النظام الحدث من خلال ضبط ACTION_CANCEL وFLAG_CANCELED على كائن حدث الحركة. فإذا تعطلت المؤشرات الأخرى، فسيضبط النظام ACTION_POINTER_UP وFLAG_CANCELED.

عندما يتلقّى تطبيقك حدث حركة باستخدام ACTION_POINTER_UP، ابحث عن FLAG_CANCELED لتحديد ما إذا كان الحدث يشير إلى رفض راحة اليد (أو إلغاء حدث آخر).

تطبيقات تدوين الملاحظات

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

<intent-filter>
    <action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

عند تسجيل تطبيق، يمكن للمستخدم اختياره ليكون التطبيق التلقائي لتدوين الملاحظات. وعند طلب ملاحظة جديدة، من المفترض أن ينشئ التطبيق ملاحظة فارغة جاهزة للإدخال بقلم الشاشة. عندما يريد المستخدِم إضافة تعليقات توضيحية إلى صورة (مثل لقطة شاشة أو صورة تم تنزيلها)، يتم تشغيل التطبيق من خلال ClipData الذي يتضمّن عنصرًا واحدًا أو أكثر يتضمّن معرّفات الموارد المنتظمة (URI) لـ content://. يجب أن ينشئ التطبيق ملاحظة تستخدم أول صورة مرفقة كصورة خلفية وأن يدخل وضعًا يمكن فيه للمستخدم الرسم على الشاشة باستخدام قلم الشاشة.

اختبار أهداف تدوين الملاحظات بدون قلم الشاشة

لاختبار استجابة أحد التطبيقات بشكل صحيح لأهداف تدوين الملاحظات بدون قلم شاشة نشط، استخدِم الطريقة التالية لعرض خيارات تدوين الملاحظات على نظام التشغيل ChromeOS:

  1. التبديل إلى وضع المطوّر وجعل الجهاز قابلاً للكتابة
  2. اضغط على Ctrl + Alt + F2 لفتح نافذة طرفية.
  3. نفِّذ الأمر sudo vi /etc/chrome_dev.conf
  4. اضغط على i لتعديل النص وإضافة --ash-enable-palette إلى سطر جديد في نهاية الملف.
  5. احفظ التغييرات بالضغط على Esc ثم كتابة : وw وq والضغط على Enter.
  6. اضغط على Ctrl + Alt + F1 للرجوع إلى واجهة مستخدم ChromeOS العادية.
  7. تسجيل الخروج ثم تسجيل الدخول من جديد

من المفترض أن تظهر الآن قائمة قلم شاشة على الرف:

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

التوافق مع الماوس ولوحة اللمس

لا تحتاج معظم التطبيقات عادةً إلى معالجة ثلاثة أحداث كبيرة تتمحور حول الشاشة: النقر بزر الماوس الأيمن والتمرير والسحب والإفلات.

النقر بزر الماوس الأيمن

يجب أن تتفاعل أيضًا أي إجراءات تؤدي إلى عرض التطبيق لقائمة سياقات، مثل النقر مع الاستمرار على عنصر قائمة، مع أحداث النقر بزر الماوس الأيمن. للتعامل مع أحداث النقر بزر الماوس الأيمن، يجب أن تسجِّل التطبيقات الرمز View.OnContextClickListener. للحصول على تفاصيل حول إنشاء قائمة سياقات، يُرجى الاطّلاع على إنشاء قوائم سياقية.

Kotlin

yourView.setOnContextClickListener {
  showContextMenu()
  true
}

Java

yourView.setOnContextClickListener(v -> {
    showContextMenu();
    return true;
});

تمرير مؤشر الماوس

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

  • الإشارة إلى المستخدمين إذا كان العنصر يتضمن سلوكًا تفاعليًا، مثل أن يكون قابلاً للنقر أو قابل للتعديل، عن طريق تغيير رمز مؤشر الماوس
  • إضافة ملاحظات مرئية إلى عناصر في قائمة أو شبكة كبيرة عندما يحرك المؤشر فوقها

Kotlin

// Change the icon to a "hand" pointer on hover,
// Highlight the view by changing the background.
yourView.setOnHoverListener { view, _ ->
  addVisualHighlighting(true)
  view.pointerIcon =
    PointerIcon.getSystemIcon(view.context,
    PointerIcon.TYPE_HAND)
  false // listener did not consume the event.
}

Java

yourView.setOnHoverListener((view, event) -> {
    addVisualHighlighting(true);
    view.setPointerIcon(PointerIcon
            .getSystemIcon(view.getContext(), PointerIcon.TYPE_HAND));
    return true;
});

سحب وإفلات

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

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

لإتاحة السحب والإفلات، يمكنك اتّباع مستندات ميزة السحب والإفلات في Android والاطّلاع على مشاركة مدونة ChromeOS هذه.

اعتبارات خاصة لنظام التشغيل ChromeOS

  • تذكر طلب إذن عبر requestDragAndDropPermissions للوصول إلى العناصر التي تم سحبها من خارج التطبيق
  • ويجب أن يتضمّن العنصر العلامة View.DRAG_FLAG_GLOBAL ليتم سحبه إلى تطبيقات أخرى.

استخدام المؤشر المتقدّم

إنّ التطبيقات التي تعالج الإدخال الخاص بالماوس ولوحة اللمس بشكل متقدّم يجب أن تتبع مستندات Android الخاصة بـ View.onGenericMotionEvent() وتستخدم MotionEvent.getSource() للتمييز بين SOURCE_MOUSE و SOURCE_TOUCHSCREEN.

يمكنك فحص MotionEvent لتنفيذ السلوك المطلوب:

  • تنشئ الحركة ACTION_HOVER_MOVE حدث.
  • تنشئ الأزرار أحداث ACTION_BUTTON_PRESS وACTION_BUTTON_RELEASE. يمكنك أيضًا التحقّق من الحالة الحالية لجميع أزرار الماوس أو لوحة اللمس باستخدام "getButtonState()".
  • يؤدي التمرير بعجلة الماوس إلى إنشاء حدثَين (ACTION_SCROLL).

أذرعة تحكُّم في الألعاب

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

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

إدخال وضع الترجمة

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

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

<uses-feature
    android:name="android.hardware.type.pc"
    android:required="false" />

مصادر إضافية