Android 表情符号应用程序兼容文本视图不渲染某些表情符号,例如

ade*_*190 6 android android-appcompat emoji

我正在尝试使用表情符号应用程序兼容文本视图,但我不明白我在实现中做错了什么。

\n

我正在尝试渲染这三个表情符号,它在 Android Q 上运行良好,但在 Android Lollipop 上不起作用,请看一下屏幕截图:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Android Q 上的屏幕截图Android Lollipop 上的屏幕截图
Android Q 上的屏幕截图Android Lollipop 上的屏幕截图
\n
\n

据我了解,使用 Emoji App Compat Text View 的想法是让 emoji 集在 Android API 21 及更高版本中正常工作,所以请看一下我的实现,是否有任何遗漏、错误或可能 Emoji App Compat文本视图不像我想象的那样工作?

\n

您可以在 github 上获取完整代码或阅读以下主要部分:

\n

应用程序的onCreate,设置EmojiCompat,我没有使用捆绑版本:

\n
EmojiCompat.init(\n    FontRequestEmojiCompatConfig(\n        this,\n        FontRequest(\n            "com.google.android.gms.fonts",\n            "com.google.android.gms",\n            "Noto Color Emoji Compat",\n            R.array.com_google_android_gms_fonts_certs\n        )\n    ).setReplaceAll(true)\n    // I did remove the callback for brevity, but I got the `onInitialized` called.\n)\n
Run Code Online (Sandbox Code Playgroud)\n

Activity,只需设置布局,获取View并设置文本:

\n
<?xml version="1.0" encoding="utf-8"?>\n<androidx.constraintlayout.widget.ConstraintLayout \n\xe2\x80\xa6\n    <androidx.emoji.widget.EmojiAppCompatTextView\n        android:id="@+id/text_view"\n        android:layout_width="wrap_content"\n        android:layout_height="wrap_content"\n        android:textSize="60sp"\n        app:layout_constraintBottom_toBottomOf="parent"\n        app:layout_constraintLeft_toLeftOf="parent"\n        app:layout_constraintRight_toRightOf="parent"\n        app:layout_constraintTop_toTopOf="parent" />\n\xe2\x80\xa6\n</androidx.constraintlayout.widget.ConstraintLayout>\n
Run Code Online (Sandbox Code Playgroud)\n
class MainActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n        findViewById<EmojiAppCompatTextView>(R.id.text_view).text = getString(R.string.three_emojis)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

弦乐

\n
<string name="three_emojis"></string>\n
Run Code Online (Sandbox Code Playgroud)\n

梯度

\n
plugins {\n    id "com.android.application"\n    id "kotlin-android"\n}\n\nandroid {\n    compileSdkVersion 29\n    buildToolsVersion "30.0.2"\n\xe2\x80\xa6\n    defaultConfig {\n        minSdkVersion 21\n        targetSdkVersion 29\n\xe2\x80\xa6\n    }\n\xe2\x80\xa6\n}\n\ndependencies {\n    implementation "androidx.emoji:emoji-appcompat:1.1.0"\n    implementation "androidx.emoji:emoji:1.1.0"\n    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"\n    implementation "androidx.appcompat:appcompat:1.2.0"\n    implementation "androidx.constraintlayout:constraintlayout:2.0.4"\n    implementation "androidx.core:core-ktx:1.3.2"\n    implementation "com.google.android.material:material:1.2.1"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Har*_* D. 3

结论:默认情况下,将使用文本样式,除非后面跟着 U+FE0F 变体选择器。

这可以使用以下方法进行验证:

情况 1:在所有 Android 版本上返回 false。

EmojiCompat.get().hasEmojiGlyph(String(charArrayOf('\uD83D', '\uDC41')))
Run Code Online (Sandbox Code Playgroud)

情况 2:在 Android API 版本 >=18 上返回 true

EmojiCompat.get().hasEmojiGlyph(String(charArrayOf('\uD83D', '\uDC41', 65039.toChar())))
Run Code Online (Sandbox Code Playgroud)

解决方案.setUseEmojiAsDefaultStyle(true)

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
        EmojiCompat.init(
            FontRequestEmojiCompatConfig(
                this,
                FontRequest(
                    "com.google.android.gms.fonts",
                    "com.google.android.gms",
                    "Noto Color Emoji Compat",
                    R.array.com_google_android_gms_fonts_certs
                )
            ).setReplaceAll(true)
                .setUseEmojiAsDefaultStyle(true)
                .registerInitCallback(object : EmojiCompat.InitCallback() {
                    override fun onInitialized() {
                        super.onInitialized()
                        Toast.makeText(this@App, "EmojiCompat was initialized", LENGTH_SHORT).show()
                    }

                    override fun onFailed(throwable: Throwable?) {
                        super.onFailed(throwable)
                        throw RuntimeException(throwable)
                    }
                })
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Android API 19 上测试:

在此输入图像描述