תמיכה בסמלי אמוג'י מודרניים

איך עושים את זה ב-Compose
‫Jetpack Compose היא ערכת הכלים המומלצת לפיתוח ממשק משתמש ב-Android. איך להוסיף תמיכה באמוג'י ב-Compose.

קבוצת האמוג'י הרגילה מתעדכנת מדי שנה על ידי Unicode, כי השימוש באמוג'י גדל במהירות בכל סוגי האפליקציות.

אם האפליקציה שלכם מציגה תוכן מהאינטרנט או מספקת קלט טקסט, מומלץ מאוד לתמוך בגופני האמוג'י העדכניים ביותר. אחרת, יכול להיות שאמוג'י חדשים יותר יוצגו כריבוע קטן שנקרא טופו (☐) או כרצפים אחרים של אמוג'י שלא מוצגים בצורה נכונה.

בגרסאות Android 11 (רמת API 30) ומטה אי אפשר לעדכן את גופן האמוג'י, ולכן צריך לעדכן ידנית אפליקציות שמציגות אותם בגרסאות האלה.

הנה כמה דוגמאות לאמוג'י מודרניים.

דוגמאות גרסה
🫩 🪉 🇨🇶 ‫16.0 (ספטמבר 2024)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 ‫15.1 (ספטמבר 2023)
🩷 🫸🏼 🐦‍⬛ ‫15.0 (ספטמבר 2022)
🫠 🫱🏼‍🫲🏿 🫰🏽 ‫14.0 (ספטמבר 2021)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 ‫13.1 (ספטמבר 2020)
🥲 🥷🏿 🐻‍❄️ 13.0 (מרץ 2020)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 ‫12.1 (אוקטובר 2019)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 ‫12.0 (פברואר 2019)

הספרייה androidx.emoji2:emoji2 מספקת תאימות פשוטה יותר לדורות קודמים עם גרסאות ישנות יותר של Android. הספרייה emoji2 היא תלות של הספרייה AppCompat, והיא לא דורשת הגדרות נוספות כדי לפעול.

תמיכה באמוג'י ב-Compose

‫BOM ממרץ 2023 (Compose UI 1.4) כולל תמיכה בגרסה העדכנית של אמוג'י, כולל תאימות לדורות קודמים של Android עד API 21. בדף הזה מוסבר איך להגדיר אמוג'י מודרניים במערכת View. מידע נוסף זמין בדף אמוג'י ב-Compose.

דרישות מוקדמות

כדי לוודא שהאפליקציה מציגה בצורה תקינה אמוג'י חדשים יותר, צריך להפעיל אותה במכשיר עם Android מגרסה 10 (רמת API ‏29) ומטה. הדף הזה כולל אמוג'י מודרניים שאפשר להציג לצורך בדיקה.

שימוש ב-AppCompat כדי לתמוך באמוג'י העדכני ביותר

AppCompat 1.4 כולל תמיכה באמוג'י.

כדי להשתמש ב-AppCompat לתמיכה באמוג'י, מבצעים את הפעולות הבאות:

  1. מוודאים שהמודול תלוי בגרסה 1.4.0-alpha01 או בגרסה חדשה יותר של הספרייה AppCompat.

    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 או גרסה קודמת ומציגים את מחרוזת הבדיקה הבאה. חשוב לוודא שכל התווים מוצגים בצורה תקינה.

    • ‫16.0: 🫩, 🪉, 🇨🇶
    • ‫15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • ‫15.0: 🩷, 🫸🏼, 🐦‍⬛
    • ‫14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • ‫13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • ‫13.0: 🥲, 🥷🏿, 🐻‍❄️
    • ‫12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • ‫12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

האפליקציה מציגה באופן אוטומטי אמוג'י שתואמים לדורות קודמים בכל המכשירים שכוללים ספק גופנים להורדה שתואם ל-emoji2, כמו מכשירים שמופעלים על ידי Google Play Services.

אם האפליקציה משתמשת ב-AppCompat אבל מציגה ריבועים ריקים (☐)

במקרים מסוימים, יכול להיות שהאפליקציה תציג טופו במקום את האמוג'י המתאים, גם אם תוסיפו את הספרייה AppCompat. הנה כמה הסברים ופתרונות אפשריים.

אתם מפעילים את האפליקציה במכשיר שעבר לאחרונה איפוס קושחה או באמולטור חדש

מנקים את נתוני Google Play Services של האפליקציה כדי לנקות את כל נתוני המטמון של הגופנים שעלולים להיווצר במהלך ההפעלה. בדרך כלל הבעיה נפתרת אחרי כמה שעות.

כדי לנקות את נתוני האפליקציה:

  1. פותחים את ההגדרות במכשיר Android.

  2. מקישים על אפליקציות והתראות.

  3. לוחצים על הצגת כל האפליקציות או על פרטי האפליקציה.

  4. גוללים ברשימת האפליקציות ולוחצים על Google Play Services.

  5. לוחצים על אחסון ומטמון.

  6. לוחצים על מחיקת המטמון.

האפליקציה לא משתמשת במחלקה שקשורה לטקסט של AppCompat

זה יכול לקרות אם לא מרחיבים את AppCompatActivity או אם יוצרים מופע של תצוגה בקוד, כמו TextView. כדאי לבדוק את הדברים הבאים:

  • הפעילות מרחיבה את AppCompatActivity.
  • אם יוצרים את התצוגה בקוד, צריך להשתמש במחלקה המשניתAppCompat הנכונה.

‫AppCompatActivity מנפח באופן אוטומטי את AppCompatTextView במקום TextView כשמנפחים XML, כך שאין צורך לעדכן את ה-XML.

בטלפון לבדיקה אין תמיכה בגופנים שניתנים להורדה

מוודאים שהפונקציה DefaultEmojiCompatConfig.create מחזירה הגדרה שאינה null.

באמולטור ברמת API מוקדמת יותר לא שודרגו Google Play Services

כשמשתמשים באמולטור ברמת API מוקדמת יותר, יכול להיות שצריך לעדכן את חבילת Google Play Services של 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 ובקוד – בכל מקום שבו אתם משתמשים ב-TextView, ב-EditText או ב-Button – השתמשו במקום זאת ב-EmojiTextView, ב-EmojiEditText או ב-EmojiButton.

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

    כשכוללים את המודול emoji2, המערכת משתמשת בספק ברירת המחדל של גופנים שניתנים להורדה כדי לטעון את גופן האמוג'י באופן אוטומטי זמן קצר אחרי הפעלת האפליקציה. אין צורך בהגדרות נוספות.

  3. כדי לבדוק את השילוב, מפעילים את האפליקציה במכשיר עם Android בגרסה 11 או גרסה קודמת, שמוצגות בו מחרוזות הבדיקה הבאות. חשוב לוודא שכל התווים מוצגים בצורה תקינה.

    • ‫16.0: 🫩, 🪉, 🇨🇶
    • ‫15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • ‫15.0: 🩷, 🫸🏼, 🐦‍⬛
    • ‫14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • ‫13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • ‫13.0: 🥲, 🥷🏿, 🐻‍❄️
    • ‫12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • ‫12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

שימוש ב-EmojiCompat בלי ווידג'טים

EmojiSpan משמש את EmojiCompat כדי לעבד תמונות בצורה נכונה. לכן, הוא צריך להמיר כל אובייקט 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) יכולים להשתמש ב-method‏ getEmojiMatch() כדי לבדוק אם מופע של EmojiCompat יכול לעבד אמוג'י. השיטה הזו מקבלת 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 או גרסה קודמת ומציגים את מחרוזת הבדיקה הבאה. חשוב לוודא שכל התווים מוצגים בצורה תקינה.

    • ‫16.0: 🫩, 🪉, 🇨🇶
    • ‫15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • ‫15.0: 🩷, 🫸🏼, 🐦‍⬛
    • ‫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() כדי לרשום ולבטל את הרישום של פונקציות קריאה חוזרת (callback) של אתחול. האפליקציה משתמשת בקריאות החוזרות האלה כדי להמתין עד שהאתחול של EmojiCompat יסתיים לפני שהיא מעבדת את האמוג'י בשרשור ברקע או בתצוגה בהתאמה אישית.

כדי להשתמש בשיטות האלה, יוצרים מופע של המחלקה EmojiCompat.InitCallback. מפעילים את השיטות האלה ומעבירים את המכונה של המחלקה EmojiCompat.InitCallback. כשהאתחול מסתיים בהצלחה, המחלקה EmojiCompat קוראת ל-method‏ onInitialized(). אם ההפעלה של הספרייה נכשלת, המחלקה EmojiCompat קוראת ל-method‏ onFailed().

כדי לבדוק את מצב האיניציאליזציה בכל שלב, צריך להפעיל את השיטה getLoadState(). השיטה הזו מחזירה אחד מהערכים הבאים: LOAD_STATE_LOADING, LOAD_STATE_SUCCEEDED, או LOAD_STATE_FAILED.

תמיכה בגופנים מקובצים עם emoji2

אתם יכולים להשתמש ברכיב emoji2-bundled כדי להוסיף לאפליקציה גופן אמוג'י. עם זאת, מכיוון שהגופן NotoColorEmoji גדול מ-10MB, אנחנו ממליצים מאוד להשתמש באפליקציה בגופנים שניתנים להורדה, כשאפשר. הארטיפקט 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. מוודאים שמחרוזת הבדיקה מוצגת בצורה נכונה.

    • ‫16.0: 🫩, 🪉, 🇨🇶
    • ‫15.1: 🐦‍🔥, 🧑‍🧑‍🧒‍🧒, 👩🏽‍🦽‍➡️, 🇲🇶
    • ‫15.0: 🩷, 🫸🏼, 🐦‍⬛
    • ‫14.0: 🫠, 🫱🏼‍🫲🏿, 🫰🏽
    • ‫13.1: 😶‍🌫️, 🧔🏻‍♀️, 🧑🏿‍❤️‍🧑🏾
    • ‫13.0: 🥲, 🥷🏿, 🐻‍❄️
    • ‫12.1: 🧑🏻‍🦰, 🧑🏿‍🦯, 👩🏻‍🤝‍👩🏼
    • ‫12.0: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

ההשפעה של הגדרה אוטומטית של EmojiCompat

המערכת מחילה את הגדרות ברירת המחדל באמצעות ספריית ההפעלה, EmojiCompatInitializer ו-DefaultEmojiCompatConfig.

אחרי שהפעילות הראשונה מתחדשת באפליקציה, המאתחל מתזמן את טעינת הגופן של האמוג'י. העיכוב הקצר הזה מאפשר לאפליקציה להציג את התוכן הראשוני שלה בלי זמן אחזור פוטנציאלי בגלל טעינת גופנים בשרשור ברקע.

‫DefaultEmojiCompatConfig מחפש ספק גופנים להורדה שמותקן במערכת ומטמיע את הממשק EmojiCompat, כמו Google Play Services. במכשירים שמופעלים על ידי Google Play Services, הגופן נטען באמצעות Google Play Services.

האתחול יוצר שרשור ברקע כדי לטעון את גופן האמוג'י, והורדת הגופן יכולה להימשך עד 10 שניות לפני שתסתיים. אחרי שהגופן יורד, לוקח בערך 150 אלפיות השנייה בשרשור ברקע כדי להפעיל את EmojiCompat.

דחו את האתחול של EmojiCompat, גם אם השבתתם את EmojiCompatInitializer. אם אתם מגדירים באופן ידני את EmojiCompat, צריך להפעיל את EmojiCompat.load() אחרי שהמסך הראשון של האפליקציה מוצג, כדי למנוע תחרות על משאבים ברקע עם טעינת המסך הראשון.

אחרי הטעינה, EmojiCompat משתמשת בכ-300KB של זיכרון RAM כדי לשמור את המטא-נתונים של האמוג'י.