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

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

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

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

בגרסאות Android 11 (רמת API 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 UI 1.4) כולל תמיכה בגרסה האחרונה של אמוג'י, כולל תאימות לאחור לגרסאות Android ישנות יותר עד API 21. בדף הזה נסביר איך להגדיר אמוג'י מודרניים במערכת View. מידע נוסף זמין בדף אמוג'י בכתיבה.

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

כדי לוודא שהאפליקציה מציגה בצורה תקינה אמוג'י חדשים יותר, צריך להפעיל אותה במכשיר עם Android מגרסה 10 (רמת API 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 Services.

אם האפליקציה שלכם משתמשת ב-AppCompat אבל מוצגת בה סמליל טופו (☐)

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

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

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

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

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

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

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

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

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

  6. מקישים על ניקוי המטמון.

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

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

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

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

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

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

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

    • 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, שנועדו לשימוש בתצוגות בהתאמה אישית. אלה הם ה-helpers שבהם נעשה שימוש בספרייה 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 מסיק שהמערכת יכולה להציג אמוג'י, הוא לא מחליף את האמוג'י הזה. כשהערך של EmojiCompat מוגדר כ-true, כל סמלי האמוג'י מוחלפים באובייקטים מסוג EmojiSpan.
  • setEmojiSpanIndicatorEnabled(): מציין אם EmojiCompat מחליף אמוג'י באובייקט EmojiSpan. כשהערך של true הוא true, EmojiCompat מצייר רקע ל-EmojiSpan. השיטה הזו משמשת בעיקר למטרות ניפוי באגים.
  • setEmojiSpanIndicatorColor: מגדיר את הצבע לציון EmojiSpan. ערך ברירת המחדל הוא GREEN.
  • registerInitCallback(): מודיע לאפליקציה על מצב האיפוס של EmojiCompat.

הוספת מאזינים לאתחול

הכיתות EmojiCompat ו-EmojiCompat.Config מספקות את השיטות registerInitCallback() ו-unregisterInitCallback() לרישום ולביטול רישום של פונקציות קריאה חוזרת (callbacks) לצורך אתחול. האפליקציה משתמשת בקריאות החזרה האלה כדי להמתין עד לטעינה של EmojiCompat לפני עיבוד אמוג'י בשרשור רקע או בתצוגה מותאמת אישית.

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

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

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

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

    • 14.0: ‏ 🫠, ‏ 🫱🏼‍🫲🏿, ‏ 🫰🏽
    • 13.1: 😶‍🌫️, ‏ 🧔🏻‍♀️, ‏ 🧑🏿‍❤️‍🧑🏾
    • 13.0: ‏ 🥲, ‏ 🥷🏿, ‏ 🐻‍❄️
    • 12.1: 🧑🏻‍🦰, ‏ 🧑🏿‍🦯, ‏ 👩🏻‍🤝‍👩🏼
    • 12.0: 🦩, ‏ 🦻🏿, ‏ 👩🏼‍🤝‍👩🏻

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

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

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

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

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

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

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