عرض الرموز التعبيرية

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

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

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

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

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

BOM في آذار (مارس) 2023 (الإصدار 1.4 من واجهة Compose) الذي يتيح أحدث إصدار من الرموز التعبيرية، بما في ذلك التوافق مع الإصدارات القديمة من Android وصولاً إلى واجهة برمجة التطبيقات 21.

لا يتطلّب هذا الدعم إجراء أي تغييرات على تطبيقك: عند استخدام Text وTextField (المادة 2 أو المادّة 3) أو BasicText وBasicTextField، سيكون بإمكانك استخدام الرموز التعبيرية العصرية بشكل فوري.

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

إذا كنت تستخدم حلاً مخصّصًا للرموز التعبيرية أو كنت بحاجة إلى إيقاف درجة الدقة التلقائية للرموز التعبيرية في ميزة "إنشاء" لأي سبب آخر، يمكنك استخدام PlatformTextStyle(emojiSupportMatch):

Text(
    text = "Hello $EMOJI_TEXT",
    style = TextStyle(
        platformStyle = PlatformTextStyle(
            emojiSupportMatch = EmojiSupportMatch.None
        )/* ... */
    )
)

التوافقية

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

يمتد من ComponentActivity

إذا كان Activity يمتد من ComponentActivity إلى ميزة "إنشاء" بدلاً من AppCompatActivity، اتّبِع تعليمات الرموز التعبيرية الخاصة بالدعم بدون AppCompat.

بما أنّك لا توسِّع نطاق AppCompatActivity، أضِف مكتبة الرموز التعبيرية2 إلى العناصر الاعتمادية الخاصة بك واستخدِم EmojiTextView في طرق العرض الخاصة بك بدلاً من تطبيق TextView المصغّر، كما هو موضّح في المقتطف التالي:

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val emojiTextView: EmojiTextView = findViewById(R.id.emoji_text_view)
        emojiTextView.text = getString(R.string.emoji_text_view, EMOJI_TEXT)

        val composeView: ComposeView = findViewById(R.id.compose_view)

        composeView.apply {
            setContent {
                // compose code
            }
        }
    }
}

بعد ذلك، في ملف XML:

<androidx.emoji2.widget.EmojiTextView
    android:id="@+id/emoji_text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

يمتد من AppCompatActivity

إذا كان Activity يمتد من AppCompatActivity، يمكنك استخدام ComposeView لطلب الدوال القابلة للإنشاء. تظهر الرموز التعبيرية بشكل صحيح في إصدارات Android عند استخدام عناصر نصية قابلة للإنشاء

في حال توسيع النطاق من AppCompatActivity، يجب تضخيم TextView من ملف XML لعرض الرموز التعبيرية بشكل صحيح.

ينطبق هذا في حال تضخيم XML:

  • خارج ComposeView، في Activity. لاحِظ استخدام AppCompatActivity وTextView في المقتطف التالي:

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val emojiTextView: TextView = findViewById(R.id.emoji_text_view)
        emojiTextView.text = getString(R.string.emoji_text_view, EMOJI_TEXT)

        val composeView: ComposeView = findViewById(R.id.compose_view)

        composeView.apply {
            setContent {
                // compose code
            }
        }
    }
}

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(
            ComposeView(this).apply {
                setContent {
                    Column {
                        Text(EMOJI_TEXT)

                        AndroidViewBinding(ExampleViewBinding::inflate) {
                            emojiTextView.text = EMOJI_TEXT
                        }
                    }
                }
            }
        )
    }
}

لتكبير نص باستخدام AndroidView داخل ComposeView، استخدِم AppCompatTextView لعرض الرموز التعبيرية بشكل صحيح:

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(
            ComposeView(this).apply {
                setContent {
                    Column {
                        Text(EMOJI_TEXT)

                        AndroidView(
                            factory = { context -> AppCompatTextView(context) },
                            update = { it.text = EMOJI_TEXT }
                        )
                    }
                }
            }
        )
    }
}

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

تحديد المشاكل وحلّها

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