إتاحة الرموز التعبيرية الحديثة

تجربة ميزة "الكتابة"
‫Jetpack Compose هي مجموعة أدوات واجهة المستخدم المُقترَحة لنظام التشغيل Android. تعرَّف على كيفية إتاحة الرموز التعبيرية في ميزة "الكتابة".

يتم تعديل المجموعة العادية من رموز الإيموجي سنويًا من قِبل يونيكود، لأنّ استخدام رموز الإيموجي يزداد بسرعة في جميع أنواع التطبيقات.

إذا كان تطبيقك يعرض محتوى على الإنترنت أو يتيح إدخال نص، ننصح بشدة بإتاحة أحدث خطوط الرموز التعبيرية. بخلاف ذلك، قد يتم عرض الرموز التعبيرية اللاحقة على شكل مربّع صغير يُعرف باسم tofu (☐) أو تسلسلات رموز تعبيرية أخرى معروضة بشكلٍ غير صحيح.

لا يمكن لإصدارات Android 11 (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأقدم تحديث خط الرموز التعبيرية، لذلك يجب تعديل التطبيقات التي تعرضها على هذه الإصدارات يدويًا.

في ما يلي أمثلة على الرموز التعبيرية الحديثة.

أمثلة الإصدار
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (أيلول/سبتمبر 2021)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (أيلول/سبتمبر 2020)
🥲 🥷🏿 🐻‍❄️ 13.0 (آذار/مارس 2020)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (تشرين الأول/أكتوبر 2019)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (شباط/فبراير 2019)

توفّر مكتبة androidx.emoji2:emoji2 توافقًا أسهل مع الإصدارات القديمة من Android. مكتبة emoji2 هي مكتبة تابعة مكتبة AppCompat ولا تتطلّب مزيدًا من الإعدادات للعمل.

إتاحة رموز الإيموجي في ميزة "الإنشاء"

توفّر مجموعة بيانات المنتجات (BOM) لشهر آذار (مارس) 2023 (واجهة مستخدم Compose 1.4) أحدث إصدار من الرموز التعبيرية، بما في ذلك التوافق مع الإصدارات القديمة من Android حتى IDE 21. تتناول هذه الصفحة كيفية ضبط رموز الإيموجي الحديثة في نظام View. اطّلِع على صفحة الرموز التعبيرية في ميزة "الإنشاء" للحصول على مزيد من المعلومات.

المتطلّبات الأساسية

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

استخدام AppCompat لتوفير أحدث رموز الإيموجي

AppCompat يتضمّن الإصدار 1.4 ميزة استخدام الرموز التعبيرية.

لاستخدام AppCompat لتفعيل الرموز التعبيرية، اتّبِع الخطوات التالية:

  1. تأكَّد من أنّ وحدتك تعتمد على إصدار مكتبة AppCompat 1.4.0-alpha01 أو إصدار أحدث.

    build.gradle
    
    // Ensure version is 1.4.0-alpha01 or higher.
    implementation "androidx.appcompat:appcompat.$appcompatVersion"
    
  2. تأكَّد من أنّ جميع الأنشطة التي تعرض نصًا تمدّد فئة AppCompatActivity.

    Kotlin

    MyActivity.kt
    
    class MyActivity: AppCompatActivity {
    ...
    }
    

    Java

    MyActivity.java
    
    class MyActivity extends AppCompatActivity {
    ...
    }
    
  3. يمكنك اختبار عملية الدمج من خلال تشغيل تطبيقك على جهاز يعمل بنظام التشغيل Android 10 أو إصدار أقدم وعرض سلسلة الاختبار التالية. تأكَّد من أنّ جميع الأحرف معروضة بشكل صحيح.

    • الإصدار 14.0: 🫠 و🫱🏼‍🫲🏿 و🫰🏽
    • 13.1: 😶‍🌫️ و🧔🏻‍♀️ و🧑🏿‍❤️‍🧑🏾
    • الإصدار 13.0: 🥲 و🥷🏿 و🐻‍❄️
    • 12.1: 🧑🏻‍🦰 و🧑🏿‍🦯 و👩🏻‍🤝‍👩🏼
    • الإصدار 12.0: 🦩 و🦻🏿 و👩🏼‍🤝‍👩🏻

يعرض تطبيقك تلقائيًا الرموز التعبيرية المتوافقة مع الإصدارات القديمة على جميع الأجهزة التي توفّر فيها خدمة مزوّد خطوط قابل للتنزيل ومتوافق مع emoji2، مثل الأجهزة التي تعمل بنظام خدمات Google Play.

إذا كان تطبيقك يستخدم AppCompat ولكنه يعرض رمز tofu (☐)

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

تشغيل التطبيق على جهاز تم تثبيت نظام التشغيل عليه مؤخرًا أو على محاكي جديد

محو بيانات "خدمات Google Play" للتطبيق لمحو أي ذاكرة تخزين مؤقت للخطوط قد تحدث أثناء بدء التشغيل يؤدي ذلك عادةً إلى حلّ المشكلة بعد بضع ساعات.

لمحو بيانات التطبيق، اتّبِع الخطوات التالية:

  1. افتح الإعدادات على جهاز Android.

  2. انقر على التطبيقات والإشعارات.

  3. انقر على عرض كل التطبيقات أو معلومات التطبيق.

  4. انتقِل بين التطبيقات وانقر على خدمات Google Play.

  5. انقر على مساحة التخزين وذاكرة التخزين المؤقت.

  6. انقر على محو ذاكرة التخزين المؤقت.

لا يستخدم تطبيقك فئة مرتبطة بالنص في مكتبة AppCompat.

ويمكن أن يحدث ذلك إذا لم تُوسِّع AppCompatActivity أو إذا أنشأت مثيلًا لمحاولة عرض في الرمز البرمجي، مثل TextView. تحقَّق مما يلي:

  • تم تمديد النشاط لمدة AppCompatActivity.
  • في حال إنشاء طريقة العرض في الرمز البرمجي، استخدِم AppCompat الفئة الفرعية الصحيحة.

يملأ AppCompatActivity AppCompatTextView تلقائيًا بدلاً من TextView عند توسيع ملف XML، لذا لا تحتاج إلى تعديل ملف XML.

لا يتيح الهاتف الاختبار استخدام الخطوط القابلة للتنزيل.

تأكَّد من أنّ DefaultEmojiCompatConfig.create يعرض إعدادًا غير صفري.

محاكي يعمل بمستوى واجهة برمجة تطبيقات أقدم لم يُحدِّث "خدمات Google Play"

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

للتأكّد من تثبيت إصدار متوافق، اتّبِع الخطوات التالية:

  1. نفِّذ الأمر التالي:

    adb shell dumpsys package com.google.android.gms | grep version
    
  2. تأكَّد من أنّ versionCode أعلى من 211200000.

إتاحة رموز الإيموجي بدون حزمة AppCompat

إذا لم يكن بإمكان تطبيقك تضمين AppCompat، يمكنه استخدام emoji2 مباشرةً. يتطلب هذا الإجراء مزيدًا من العمل، لذا لا تستخدِم هذه الطريقة إلا إذا تعذّر على تطبيقك استخدام AppCompat.

لتفعيل الرموز التعبيرية بدون مكتبة AppCompat، اتّبِع الخطوات التالية:

  1. في ملف build.gradle الخاص بتطبيقك، أدرِج emoji2 وemoji2-views.

    build.gradle
    
    def emojiVersion = "1.0.0-alpha03"
    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-views:$emojiVersion"
    

    توفّر وحدة emoji2-views فئات فرعية من TextView وButton وEditText التي تنفّذ EmojiCompat. لا تستخدِمه في تطبيق يتضمّن AppCompat، لأنّه ينفِّذ EmojiCompat من قَبل.

  2. في ملف XML والرموز البرمجية، استخدِم EmojiTextView أو EmojiEditText أو EmojiButton بدلاً من TextView أو EditText أو Button في أيّ مكان تستخدم فيه هذه الرموز.

    activity_main.xml
    
    <androidx.emoji2.widget.EmojiTextView ... />
    <androidx.emoji2.widget.EmojiEditText ... />
    <androidx.emoji2.widget.EmojiButton ... />
    

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

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

    • الإصدار 14.0: 🫠 و🫱🏼‍🫲🏿 و🫰🏽
    • 13.1: 😶‍🌫️ و🧔🏻‍♀️ و🧑🏿‍❤️‍🧑🏾
    • الإصدار 13.0: 🥲 و🥷🏿 و🐻‍❄️
    • 12.1: 🧑🏻‍🦰 و🧑🏿‍🦯 و👩🏻‍🤝‍👩🏼
    • الإصدار 12.0: 🦩 و🦻🏿 و👩🏼‍🤝‍👩🏻

استخدام EmojiCompat بدون التطبيقات المصغّرة

يستخدم EmojiCompat EmojiSpan لمحاولة عرض الصور الصحيحة. لذلك، يجب تحويل أي عنصر CharSequence معيّن إلى عنصر Spanned يتضمّن EmojiSpan عنصرًا. توفّر فئة EmojiCompat طريقة process() لتحويل CharSequences إلى عناصر Spanned. باستخدام هذه الطريقة، يمكنك استدعاء process() في الخلفية وتخزين النتائج مؤقتًا، ما يؤدي إلى تحسين أداء تطبيقك.

Kotlin

val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")

Java

CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");

استخدام EmojiCompat لمحرّري طرق الإدخال

تسمح فئة EmojiCompat للوحات المفاتيح بعرض الرموز التعبيرية المتوافقة مع التطبيق الذي تتم تفاعله معه. يمكن لمحرّري أساليب الإدخال (IME) استخدام الرمز getEmojiMatch() للتحقّق مما إذا كان EmojiCompat قادرًا على عرض رمز emojy. تأخذ هذه الطريقة CharSequence رمزًا تعبيريًا وتُعرِض true إذا كان EmojiCompat قادرًا على رصد الرمز التعبيري وعرضه.

يمكن أن تتحقّق لوحة المفاتيح أيضًا من إصدار EmojiCompat الذي يتيحه التطبيق لتحديد الرموز التعبيرية التي سيتم عرضها في لوحة الألوان. للتحقّق من الإصدار، إذا كان متاحًا، يمكن أن تبحث لوحة المفاتيح عن المفاتيح التالية في حِزمة EditorInfo.extras:

  • EDITOR_INFO_METAVERSION_KEY: يمثّل إصدار البيانات الوصفية لرموز الإيموجي التي يستخدمها التطبيق. إذا لم يكن هذا المفتاح متوفّرًا، يعني ذلك أنّ التطبيق لا يستخدم EmojiCompat.
  • EDITOR_INFO_REPLACE_ALL_KEY: إذا كان المفتاح متوفّرًا وتم ضبطه على true، سيضبط التطبيق EmojiCompat لاستبدال كل الرموز التعبيرية، حتى إذا كانت متوفّرة في النظام.

اطّلِع على مزيد من المعلومات حول كيفية ضبط مثيل لملف برمجي EmojiCompat.

استخدام الرموز التعبيرية في طرق العرض المخصّصة

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

تختلف العملية حسب ما إذا كان تطبيقك يستخدم مكتبة AppCompat.

إضافة طرق عرض مخصّصة للتطبيقات التي تستخدم حزمة AppCompat

إذا كان تطبيقك يستخدم AppCompat، يمكنك توسيع نطاق تنفيذ AppCompat بدلاً من تنفيذ النظام الأساسي. استخدِم الجدول التالي كدليل لكيفية توسيع نطاق مشاهدات قناتك في AppCompat:

بدلاً من التمديد... تمديد
TextView AppCompatTextView
EditText AppCompatEditText
ToggleButton AppCompatToggleButton
Switch SwitchCompat
Button AppCompatButton
CheckedTextView AppCompatCheckedTextView
RadioButton AppCompatRadioButton
CheckBox AppCompatCheckBox
AutoCompleteTextView AppCompatAutoCompleteTextView
MultiAutoCompleteTextView AppCompatMultiAutoCompleteTextView

إضافة طرق عرض مخصّصة للتطبيقات التي لا تتضمّن حزمة AppCompat

إذا كان تطبيقك لا يستخدم AppCompat، استخدِم أدوات مساعدة دمج العرض في وحدة emoji2-views-helper المصمّمة للاستخدام في طرق العرض المخصّصة. هذه هي العناصر المساعدة التي تستخدمها مكتبة AppCompat لتوفير إمكانية استخدام رموز الإيموجي.

أكمِل الخطوات التالية لإتاحة جداول الاطّلاع المخصّصة للتطبيقات التي لا تستخدم AppCompat.

  1. إضافة مكتبة emoji2-views-helper:

    implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
    
  2. اتّبِع التعليمات لتضمين رمز EmojiTextViewHelper أو EmojiEditTextHelper في طرق العرض المخصّصة لتطبيقك.

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

    • الإصدار 14.0: 🫠 و🫱🏼‍🫲🏿 و🫰🏽
    • 13.1: 😶‍🌫️ و🧔🏻‍♀️ و🧑🏿‍❤️‍🧑🏾
    • الإصدار 13.0: 🥲 و🥷🏿 و🐻‍❄️
    • 12.1: 🧑🏻‍🦰 و🧑🏿‍🦯 و👩🏻‍🤝‍👩🏼
    • الإصدار 12.0: 🦩 و🦻🏿 و👩🏼‍🤝‍👩🏻

ميزات اختيارية لمعالجة emoji2

بعد تضمين مكتبة emoji2 في تطبيقك، يمكنك إضافة ميزات اختيارية موضّحة في هذا القسم.

ضبط emoji2 لاستخدام خط مختلف أو موفِّر خط قابل للتنزيل

لضبط emoji2 لاستخدام خط مختلف أو مقدّم خطوط قابل للتنزيل، اتّبِع الخطوات التالية:

  1. أوقِف العلامة EmojiCompatInitializer من خلال إضافة ما يلي إلى البيان:

    <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer"
               tools:node="remove" />
    </provider>
  2. نفّذ أيًا مما يلي:

    • استخدِم الإعدادات التلقائية من خلال الاتصال بـ DefaultEmojiCompatConfiguration.create(context).

    • أنشئ الإعدادات الخاصة بك لتحميل الخطوط من مصدر آخر باستخدام EmojiCompat.Config. توفّر هذه الفئة عدة خيارات لتعديل EmojiCompat سلوكك، كما هو موضّح في القسم التالي.

تعديل سلوك EmojiCompat

يمكنك استخدام مثيل من EmojiCompat.Config لتعديل سلوك EmojiCompat.

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

يتيح لك العنصر LOAD_STRATEGY_MANUAL التحكّم في وقت استدعاء EmojiCompat.load()، ويؤدي العنصر LOAD_STRATEGY_DEFAULT إلى بدء التحميل بشكل متزامن في طلب العنصر EmojiCompat.init().

تستخدم معظم التطبيقات LOAD_STRATEGY_MANUAL حتى تتمكّن من التحكّم في سلسلة المحادثات والتوقيت لتحميل الخطوط. يجب أن يؤجل تطبيقك تحميل البيانات إلى ما بعد ظهور الشاشة الأولى لتجنُّب حدوث وقت استجابة في بدء التشغيل. يتّبع تطبيق EmojiCompatInitializer هذه الممارسة ويؤجل تحميل خط الرموز التعبيرية إلى ما بعد استئناف الشاشة الأولى.

استخدِم الطرق التالية من الفئة الأساسية لضبط جوانب أخرى من الإعداد:

  • setReplaceAll(): تحدد ما إذا كان EmojiCompat سيحلّ محل كل رموز الإيموجي التي يعثر عليها بمثيلات EmojiSpan. بشكلٍ تلقائي، عندما يستنتج EmojiCompat أنّ النظام يمكنه عرض رمز تعبيري، لا يستبدل هذا الرمز التعبيري. عند ضبط القيمة على true، EmojiCompat يستبدل كل رموز الإيموجي بعناصر EmojiSpan.
  • setEmojiSpanIndicatorEnabled(): يشير إلى ما إذا كان EmojiCompat يستبدل رمز إيموجي بعنصر EmojiSpan. عند ضبطها على true، ترسم EmojiCompat خلفية لملف EmojiSpan. تُستخدَم هذه الطريقة بشكل أساسي لأغراض تصحيح الأخطاء.
  • setEmojiSpanIndicatorColor: يضبط اللون للإشارة إلى EmojiSpan. القيمة التلقائية هي GREEN.
  • registerInitCallback(): يُعلم التطبيق بحالة بدء تشغيل EmojiCompat.

إضافة مستمعين لعمليات الإعداد

توفّر فئتَا EmojiCompat وEmojiCompat.Config الطريقتَين registerInitCallback() و unregisterInitCallback() لتسجيل وإزالة تسجيل وظائف الاستدعاء المخصّصة لعمليات الإعداد. يستخدم تطبيقك هذه callbacks للانتظار إلى أن يتمّ إعداد EmojiCompat قبل معالجة الرموز التعبيرية في سلسلتَي مهام في الخلفية أو في عرض مخصّص.

لاستخدام هذه الطرق، أنشئ مثيلًا لفئة EmojiCompat.InitCallback. استخدِم هاتين الطريقتَين وأدخِل مثيل فئة EmojiCompat.InitCallback. عند نجاح عملية الإعداد، تستدعي فئة EmojiCompat الطريقة onInitialized(). إذا تعذّر إعداد المكتبة، تستدعي فئة EmojiCompat الطريقة onFailed().

للتحقّق من حالة الإعداد في أي وقت، يمكنك استدعاء الأسلوب getLoadState(). تعرض هذه الطريقة إحدى القيم التالية: LOAD_STATE_LOADING أو LOAD_STATE_SUCCEEDED أو LOAD_STATE_FAILED.

إتاحة الخطوط المجمّعة مع emoji2

يمكنك استخدام العنصر emoji2-bundled لتجميع خط رموز تعبيرية في تطبيقك. ولكن بما أنّ حجم خط NotoColorEmoji يتجاوز 10 ميغابايت، ننصح بشدة باستخدام تطبيقك لخطوط قابلة للتنزيل كلما أمكن ذلك. ملف emoji2-bundled مخصّص للتطبيقات على الأجهزة التي لا تتيح استخدام الخطوط القابلة للتنزيل.

لاستخدام العنصر emoji2-bundled، اتّبِع الخطوات التالية:

  1. أدرِج عناصر emoji2-bundled وemoji2:

    implementation "androidx.emoji2:emoji2:$emojiVersion"
    implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
    
  2. ضبط emoji2 لاستخدام الإعدادات المجمّعة:

    Kotlin

    EmojiCompat.init(BundledEmojiCompatConfig(context))
    

    Java

    EmojiCompat.init(new BundledEmojiCompatConfig(context));
    
  3. اختبِر عملية الدمج باتّباع الخطوات السابقة لتضمين emojicompat مع AppCompat أو بدونه. تأكَّد من أنّ سلسلة الاختبار تظهر بشكل صحيح.

    • الإصدار 14.0: 🫠 و🫱🏼‍🫲🏿 و🫰🏽
    • 13.1: 😶‍🌫️ و🧔🏻‍♀️ و🧑🏿‍❤️‍🧑🏾
    • الإصدار 13.0: 🥲 و🥷🏿 و🐻‍❄️
    • 12.1: 🧑🏻‍🦰 و🧑🏿‍🦯 و👩🏻‍🤝‍👩🏼
    • الإصدار 12.0: 🦩 و🦻🏿 و👩🏼‍🤝‍👩🏻

تأثير الإعداد التلقائي لـ EmojiCompat

يطبّق النظام الإعدادات التلقائية باستخدام مكتبة بدء التشغيل، EmojiCompatInitializer، و DefaultEmojiCompatConfig.

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

يبحث DefaultEmojiCompatConfig عن موفِّر خطوط قابل للتنزيل ومُثبَّت على النظام لتنفيذ واجهة EmojiCompat، مثل خدمات Google Play. على الأجهزة التي تعمل بـ "خدمات Google Play"، يؤدي ذلك إلى تحميل الخط باستخدام "خدمات Google Play".

ينشئ المُنشئ سلسلة مهام في الخلفية لتحميل خط الرموز التعبيرية، ويمكن أن يستغرق تحميل الخط مدة تصل إلى 10 ثوانٍ قبل انتهاء مهلة التحميل. بعد تنزيل الخط، يستغرق EmojiCompat تهيئة 150 ملي ثانية تقريبًا في سلسلة مهام في الخلفية.

تأجيل عملية إعداد EmojiCompat، حتى في حال إيقاف EmojiCompatInitializer في حال ضبط EmojiCompat يدويًا، يمكنك استدعاء EmojiCompat.load() بعد عرض شاشة تطبيقك الأولى لتجنُّب تداخل عمليات التحميل في الخلفية مع عملية تحميل الشاشة الأولى.

بعد التحميل، يستخدم EmojiCompat حوالي 300 كيلوبايت من ذاكرة الوصول العشوائي (RAM) لتخزين metadata الرموز التعبيرية.