הצגת סמלי אמוג'י

קבוצת האמוג'י הרגילה מתעדכנת מדי שנה על ידי 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)

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

התמיכה הזו לא דורשת שינויים באפליקציה – אם אתם משתמשים ב-Text וב-TextField (Material 2 או Material 3) או ב-BasicText וב-BasicTextField, אתם מקבלים תמיכה באמוג'י מודרני באופן מיידי.

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

אם אתם משתמשים בפתרון אמוג'י בהתאמה אישית, או אם אתם צריכים להשבית את רזולוציית ברירת המחדל של האמוג'י ב-Compose מכל סיבה אחרת, אתם יכולים להשתמש ב-PlatformTextStyle(emojiSupportMatch):

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

יכולת פעולה הדדית

אם האפליקציה משתמשת גם בתצוגות וגם ב-Compose באותו Activity, חשוב להשתמש בממשקי ה-API המתאימים כדי להגדיר את האמוג'י בצורה נכונה. בקטעים הבאים מוסבר מתי להשתמש בכל API.

הארכה מ-ComponentActivity

אם ה-Activity שלכם מורחב מ-Compose ComponentActivity במקום מ-AppCompatActivity, צריך לפעול לפי ההוראות לתמיכה באמוג'י בלי AppCompat.

מכיוון שאתם לא מרחיבים את AppCompatActivity, הוסיפו את ספריית Emoji2 ליחסי התלות שלכם והשתמשו ב-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 כדי לקרוא לפונקציות קומפוזביליות. כשמשתמשים ברכיבי Text, האמוג'י מוצגים בצורה נכונה בכל גרסאות 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 }
                        )
                    }
                }
            }
        )
    }
}

פרטים נוספים זמינים במאמרי העזרה של ממשקי ה-API של יכולת הפעולה ההדדית.

פתרון בעיות

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