نمایش اموجی

مجموعه استاندارد اموجی سالانه توسط Unicode بازآوری می‌شود، زیرا استفاده از اموجی به‌سرعت برای انواع برنامه‌ها درحال افزایش است.

اگر برنامه‌تان محتوای اینترنتی نمایش می‌دهد یا ورودی نوشتاری ارائه می‌دهد، اکیداً توصیه می‌کنیم از جدیدترین قلم‌های اموجی پشتیبانی کنید. درغیراین‌صورت، اموجی‌های جدیدتر ممکن است به‌صورت یک چارگوش کوچک به‌نام توفو (☐) یا دیگر توالی‌های اموجی نادرست نمایش داده شوند.

Android نسخه ۱۱ (سطح میانای برنامه‌سازی کاربردی ۳۰) و پایین‌تر نمی‌توانند قلم اموجی را به‌روز کنند، بنابراین برنامه‌هایی که آن‌ها را در این نسخه‌ها نمایش می‌دهند باید به‌صورت دستی به‌روز شوند.

در زیر نمونه‌هایی از اموجی‌های مدرن را می‌بینید.

مثال‌ها نسخه
🫩 🪉 🇨🇶 ۱۶.۰ (سپتامبر ۲۰۲۴)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 ‫۱۵.۱ (سپتامبر ۲۰۲۳)
🩷 🫸🏼 🐦‍⬛ ۱۵٫۰ (سپتامبر ۲۰۲۲)
🫠 🫱🏼‍🫲🏿 🫰🏽 ۱۴.۰ (سپتامبر ۲۰۲۱)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 ۱۳.۱ (سپتامبر ۲۰۲۰)
🥲 🥷🏿 🐻‍❄️ ‫۱۳.۰ (مارس ۲۰۲۰)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 ‫۱۲.۱ (اکتبر ۲۰۱۹)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 ۱۲٫۰ (فوریه ۲۰۱۹)

BOM مارس ۲۰۲۳ (رابط کاربری Compose نسخه ۱.۴) از جدیدترین نسخه اموجی پشتیبانی می‌کند، ازجمله سازگاری با نسخه‌های قدیمی‌تر Android تا API 21.

این پشتیبانی نیازی به تغییر در برنامه شما ندارد— اگر از Text و TextField (Material 2 یا Material 3) یا BasicText و BasicTextField استفاده می‌کنید، پشتیبانی از اموجی‌های مدرن را به‌طور پیش‌فرض دریافت می‌کنید.

بهترین راه برای آزمایش کردن جدیدترین اموجی‌ها در برنامه‌تان استفاده از دستگاه واقعی در API نسخه ۳۰ یا پایین‌تر است.

اگر از راه‌حل اموجی سفارشی استفاده می‌کنید، یا به هر دلیل دیگری نیاز دارید وضوح اموجی پیش‌فرض را در Compose غیرفعال کنید، می‌توانید از PlatformTextStyle(emojiSupportMatch) استفاده کنید:

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

هم‌کنش‌پذیری

اگر برنامه‌تان هم از Views و هم از Compose در یک Activity استفاده می‌کند، مطمئن شوید که از میاناهای برنامه‌سازی کاربردی مناسب برای پیکربندی صحیح اموجی‌ها استفاده می‌کنید. بخش‌های زیر توضیح می‌دهند که چه زمانی باید از هر API استفاده کرد.

درحال گسترش از ComponentActivity

اگر Activity شما به‌جای AppCompatActivity از Compose ComponentActivity گسترش می‌یابد، دستورالعمل‌های پشتیبانی از اموجی بدون AppCompat را دنبال کنید.

چون AppCompatActivity را گسترش نمی‌دهید، کتابخانه Emoji2 را به وابستگی‌هایتان اضافه کنید و به‌جای ابزاره TextView، از EmojiTextView در نماهایتان استفاده کنید، همان‌طور که در قطعه کد زیر نشان داده شده است:

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 composables استفاده می‌کنید، اموجی‌ها در نسخه‌های 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 }
                        )
                    }
                }
            }
        )
    }
}

برای جزئیات، به مستندات میاناهای برنامه‌سازی کاربردی هم‌کنش‌پذیری مراجعه کنید.

عیب‌یابی

اگر به‌جای اموجی، توفو (☐) می‌بینید، ابتدا بررسی کنید که آیا مشکل از دستگاه آزمایشی خاص شما است یا نه. چند مورد اصلی وجود دارد که می‌توانید بررسی کنید: