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

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

הסטנדרט של האמוג'י מתעדכן מדי שנה על ידי 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 ולא נדרשת הגדרה נוספת כדי שהיא תפעל.

תמיכה באמוג'י בכתיבת הודעות

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

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

כדי לוודא שהאפליקציה מציגה כמו שצריך את האימוג'י החדשים, מפעילים אותה במכשיר עם 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 ללא ווידג'טים

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 יכול להציג אימוג'י. השיטה הזו מקבלת 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: 🦩, 🦻🏿, 👩🏼‍🤝‍👩🏻

תכונות אופציונליות לטיפול באמוג'י2

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

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

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

תמיכה בגופנים בחבילה עם emoji2

אפשר להשתמש בארטיפקט emoji2-bundled כדי לארוז גופן אמוג'י באפליקציה. עם זאת, מכיוון שהגופן NotoColorEmoji גדול מ-10MB, מומלץ מאוד שהאפליקציה תשתמש בגופנים שאפשר להוריד, אם אפשר. ‫Artifact‏ 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. במכשירים שמופעלים על ידי Google Play Services, הגופן נטען באמצעות Google Play Services.

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

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

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