Android 表情符号应用兼容文本视图无法呈现某些表情符号,例如
Android Emoji App Compat Text View not rendering some emojis such as
我正在尝试使用 Emoji App Compat Text View,但我不明白我在实施过程中做错了什么。
我正在尝试渲染这三个表情符号 </code>,它在 Android Q 上工作正常,但在 Android Lollipop 上不工作,拿看看截图:</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th style="text-align: center;">Screenshot on Android Q</th>
<th style="text-align: center;">Screenshot on Android Lollipop</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><a href="https://i.stack.imgur.com/Ybdjd.png" rel="nofollow noreferrer"><WBIMG:5678571-1.png></a></td>
<td style="text-align: center;"><a href="https://i.stack.imgur.com/S5uru.png" rel="nofollow noreferrer"><WBIMG:5678571-2.png></a></td>
</tr>
</tbody>
</table>
</div>
<p>据我所知,使用 Emoji App Compat Text View 的想法是让表情符号集在 android API 21 及更高版本中正常工作,所以请看看我的实现,是否有遗漏、错误或者 Emoji App Compat Text View 没有像我想的那样工作?</p>
<p>您可以获得<a href="https://github.com/ademar111190/SOQ-EmojiAppCompatTextView" rel="nofollow noreferrer">complete code here at github</a>或阅读下面的主要部分:</p>
<p>应用程序的onCreate,设置EmojiCompat,我没有使用捆绑版本:</p>
<pre><code>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)
// I did remove the callback for brevity, but I got the `onInitialized` called.
)
Activity,只需设置布局,获取视图并设置文本:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
…
<androidx.emoji.widget.EmojiAppCompatTextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="60sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
…
</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<EmojiAppCompatTextView>(R.id.text_view).text = getString(R.string.three_emojis)
}
}
字符串
<string name="three_emojis"></string>
gradle
plugins {
id "com.android.application"
id "kotlin-android"
}
android {
compileSdkVersion 29
buildToolsVersion "30.0.2"
…
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
…
}
…
}
dependencies {
implementation "androidx.emoji:emoji-appcompat:1.1.0"
implementation "androidx.emoji:emoji:1.1.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "androidx.appcompat:appcompat:1.2.0"
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
implementation "androidx.core:core-ktx:1.3.2"
implementation "com.google.android.material:material:1.2.1"
}
结论:默认情况下,会使用文字样式,除非后面跟着U+FE0F变体选择器。
这可以使用以下方法验证:
案例 1:Return 在所有 Android 版本上都是错误的。
EmojiCompat.get().hasEmojiGlyph(String(charArrayOf('\uD83D', '\uDC41')))
案例 2:Return 在 Android API 版本 >=18
上为真
EmojiCompat.get().hasEmojiGlyph(String(charArrayOf('\uD83D', '\uDC41', 65039.toChar())))
解决方案:.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)
}
})
)
}
}
测试于 Android API 19:
我正在尝试使用 Emoji App Compat Text View,但我不明白我在实施过程中做错了什么。
我正在尝试渲染这三个表情符号 </code>,它在 Android Q 上工作正常,但在 Android Lollipop 上不工作,拿看看截图:</p>
<div class="s-table-container">
<table class="s-table">
<thead>
<tr>
<th style="text-align: center;">Screenshot on Android Q</th>
<th style="text-align: center;">Screenshot on Android Lollipop</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><a href="https://i.stack.imgur.com/Ybdjd.png" rel="nofollow noreferrer"><WBIMG:5678571-1.png></a></td>
<td style="text-align: center;"><a href="https://i.stack.imgur.com/S5uru.png" rel="nofollow noreferrer"><WBIMG:5678571-2.png></a></td>
</tr>
</tbody>
</table>
</div>
<p>据我所知,使用 Emoji App Compat Text View 的想法是让表情符号集在 android API 21 及更高版本中正常工作,所以请看看我的实现,是否有遗漏、错误或者 Emoji App Compat Text View 没有像我想的那样工作?</p>
<p>您可以获得<a href="https://github.com/ademar111190/SOQ-EmojiAppCompatTextView" rel="nofollow noreferrer">complete code here at github</a>或阅读下面的主要部分:</p>
<p>应用程序的onCreate,设置EmojiCompat,我没有使用捆绑版本:</p>
<pre><code>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)
// I did remove the callback for brevity, but I got the `onInitialized` called.
)
Activity,只需设置布局,获取视图并设置文本:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
…
<androidx.emoji.widget.EmojiAppCompatTextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="60sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
…
</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<EmojiAppCompatTextView>(R.id.text_view).text = getString(R.string.three_emojis)
}
}
字符串
<string name="three_emojis"></string>
gradle
plugins {
id "com.android.application"
id "kotlin-android"
}
android {
compileSdkVersion 29
buildToolsVersion "30.0.2"
…
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
…
}
…
}
dependencies {
implementation "androidx.emoji:emoji-appcompat:1.1.0"
implementation "androidx.emoji:emoji:1.1.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "androidx.appcompat:appcompat:1.2.0"
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
implementation "androidx.core:core-ktx:1.3.2"
implementation "com.google.android.material:material:1.2.1"
}
结论:默认情况下,会使用文字样式,除非后面跟着U+FE0F变体选择器。
这可以使用以下方法验证:
案例 1:Return 在所有 Android 版本上都是错误的。
EmojiCompat.get().hasEmojiGlyph(String(charArrayOf('\uD83D', '\uDC41')))
案例 2:Return 在 Android API 版本 >=18
上为真EmojiCompat.get().hasEmojiGlyph(String(charArrayOf('\uD83D', '\uDC41', 65039.toChar())))
解决方案:.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)
}
})
)
}
}
测试于 Android API 19: