Mithilfe der EmojiCompat
-Supportbibliothek sollen Android-Geräte immer die neuesten Emojis verwenden. Dadurch wird verhindert, dass in deiner App fehlende Emoji-Zeichen in Form von ☐ angezeigt werden. Das bedeutet, dass dein Gerät keine Schriftart zum Anzeigen des Textes hat. Wenn du die EmojiCompat
-Supportbibliothek verwendest, müssen deine App-Nutzer nicht auf Updates des Android-Betriebssystems warten, um die neuesten Emojis zu erhalten.
Weitere Informationen finden Sie in den folgenden verwandten Ressourcen:
Wie funktioniert EmojiCompat?
Die EmojiCompat
-Supportbibliothek enthält Klassen zur Implementierung der abwärtskompatiblen Emoji-Unterstützung auf Geräten mit Android 4.4 (API-Level 19) und höher. Sie können EmojiCompat
mit gebündelten oder herunterladbaren Schriftarten konfigurieren. Weitere Informationen zur Konfiguration finden Sie in den folgenden Abschnitten:
EmojiCompat
identifiziert ein Emoji für eine bestimmte CharSequence
, ersetzt sie gegebenenfalls durch EmojiSpans
und rendert schließlich die Emoji-Glyphen. In Abbildung 2 ist der Prozess demonstriert.
Konfiguration für herunterladbare Schriftarten
In der Konfiguration für Schriftarten zum Herunterladen wird die Funktion der Supportbibliothek zum Herunterladen von Schriftarten verwendet, um eine Emoji-Schriftart herunterzuladen. Außerdem werden die erforderlichen Emoji-Metadaten aktualisiert, die die EmojiCompat
-Supportbibliothek benötigt, um mit den neuesten Versionen der Unicode-Spezifikation Schritt zu halten.
Abhängigkeit von Supportbibliothek hinzufügen
Wenn Sie die EmojiCompat
-Supportbibliothek verwenden möchten, müssen Sie die Klassenpfadabhängigkeiten Ihres Anwendungsprojekts in Ihrer Entwicklungsumgebung ändern.
So fügen Sie Ihrem Anwendungsprojekt eine Supportbibliothek hinzu:
- Öffnen Sie die Datei
build.gradle
Ihrer Anwendung. - Fügen Sie die Supportbibliothek zum Abschnitt
dependencies
hinzu.
Cool
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Konfiguration der herunterladbaren Schriftart initialisieren
Sie müssen EmojiCompat
initialisieren, um die Metadaten und das Schriftbild zu laden. Da die Initialisierung einige Zeit in Anspruch nehmen kann, wird der Initialisierungsprozess auf einem Hintergrundthread ausgeführt.
Führe die folgenden Schritte aus, um EmojiCompat
mit der herunterladbaren Schriftartkonfiguration zu initialisieren:
- Erstellen Sie eine Instanz der
FontRequest
-Klasse und geben Sie die Zertifizierungsstelle des Schriftartanbieters, das Paket des Schriftartanbieters, die Schriftartabfrage und eine Liste von Hash-Sätzen für das Zertifikat an. Weitere Informationen zuFontRequest
finden Sie in der Dokumentation zu herunterladbaren Schriftarten im Abschnitt Herunterladbare Schriftarten programmatisch verwenden. - Erstellen Sie eine Instanz von
FontRequestEmojiCompatConfig
und geben Sie Instanzen vonContext
undFontRequest
an. - Initialisieren Sie
EmojiCompat
, indem Sie die Methodeinit()
aufrufen und die Instanz vonFontRequestEmojiCompatConfig
übergeben. - Verwende
EmojiCompat
-Widgets in Layout-XMLs. Wenn SieAppCompat
verwenden, lesen Sie den Abschnitt EmojiCompat-Widgets mit AppCompat verwenden.
Kotlin
class MyApplication : Application() { override fun onCreate() { super.onCreate() val fontRequest = FontRequest( "com.example.fontprovider", "com.example", "emoji compat Font Query", CERTIFICATES ) val config = FontRequestEmojiCompatConfig(this, fontRequest) EmojiCompat.init(config) } }
Java
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); FontRequest fontRequest = new FontRequest( "com.example.fontprovider", "com.example", "emoji compat Font Query", CERTIFICATES); EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, fontRequest); EmojiCompat.init(config); } }
<android.support.text.emoji.widget.EmojiTextView android:layout_width="wrap_content" android:layout_height="wrap_content"/> <android.support.text.emoji.widget.EmojiEditText android:layout_width="wrap_content" android:layout_height="wrap_content"/> <android.support.text.emoji.widget.EmojiButton android:layout_width="wrap_content" android:layout_height="wrap_content"/>
Weitere Informationen zum Konfigurieren von EmojiCompat
mit der herunterladbaren Schriftartkonfiguration finden Sie in der Beispiel-App zur Emoji-Kompatibilität Java
| Kotlin.
Bibliothekskomponenten
- Widgets:
EmojiEditText
,EmojiTextView
,EmojiButton
- Standard-Widgetimplementierungen zur Verwendung von
EmojiCompat
mitTextView
,EditText
undButton
. EmojiCompat
- Öffentliche Hauptoberfläche der Supportbibliothek. Er führt alle externen Aufrufe aus und koordiniert dies mit den anderen Teilen des Systems.
EmojiCompat.Config
- Konfiguriert die zu erstellende Singleton-Instanz.
EmojiSpan
- : Eine abgeleitete
ReplacementSpan
-Klasse, die das Zeichen (Sequenzen) ersetzt und die Glyphe rendert. - Schriftart
EmojiCompat
EmojiCompat
verwendet eine Schriftart, um Emojis anzuzeigen. Diese Schriftart ist eine modifizierte Version der Android-Schriftart für Emojis. Die Schriftart wird so geändert:- Um die Abwärtskompatibilität für das Rendern von Emojis zu gewährleisten, werden alle Emoji-Zeichen mit einem einzigen Unicode-Codepunkt in der ergänzenden privaten Nutzungsbereich-A von Unicode dargestellt, die mit U+F0001 beginnt.
-
Zusätzliche Emoji-Metadaten werden in einem Binärformat in die Schriftart eingefügt und zur Laufzeit von
EmojiCompat
geparst. Die Daten werden mit dem privaten Tag Emji in die Tabellemeta
der Schriftart eingebettet.
Konfigurationsoptionen
Mit der Instanz EmojiCompat
können Sie das Verhalten von EmojiCompat
ändern. Sie können die folgenden Methoden aus der Basisklasse verwenden, um die Konfiguration festzulegen:
setReplaceAll()
: Legt fest, obEmojiCompat
alle gefundenen Emojis durchEmojiSpans
ersetzen soll.EmojiCompat
versucht standardmäßig zu verstehen, ob das System ein Emoji rendern kann, und ersetzt diese Emojis nicht. Wenntrue
festgelegt ist, ersetztEmojiCompat
alle gefundenen Emojis durchEmojiSpans
.setEmojiSpanIndicatorEnabled()
: Gibt an, obEmojiCompat
ein Emoji durch einEmojiSpan
ersetzt hat. Wenn dieser Wert auftrue
gesetzt ist, zeichnetEmojiCompat
einen Hintergrund fürEmojiSpan
. Diese Methode wird hauptsächlich zur Fehlerbehebung verwendet.setEmojiSpanIndicatorColor()
: Legt die Farbe fest, die einEmojiSpan
angibt. Der Standardwert istGREEN
.registerInitCallback
: Informiert die App über den Status der InitialisierungEmojiCompat
.
Kotlin
val config = FontRequestEmojiCompatConfig(...) .setReplaceAll(true) .setEmojiSpanIndicatorEnabled(true) .setEmojiSpanIndicatorColor(Color.GREEN) .registerInitCallback(object: EmojiCompat.InitCallback() { ... })
Java
EmojiCompat.Config config = new FontRequestEmojiCompatConfig(...) .setReplaceAll(true) .setEmojiSpanIndicatorEnabled(true) .setEmojiSpanIndicatorColor(Color.GREEN) .registerInitCallback(new InitCallback() {...})
Initialisierungs-Listener hinzufügen
Die Klassen EmojiCompat
und EmojiCompat
bieten die Methoden registerInitCallback()
und unregisterInitCallback()
zum Registrieren eines Initialisierungs-Callbacks. Wenn Sie diese Methoden verwenden möchten, erstellen Sie eine Instanz der Klasse EmojiCompat.InitCallback
. Rufen Sie diese Methoden auf und übergeben Sie die Instanz der Klasse EmojiCompat.InitCallback
. Wenn die Initialisierung der EmojiCompat
-Supportbibliothek erfolgreich ist, ruft die Klasse EmojiCompat
die Methode onInitialized()
auf. Wenn die Bibliothek nicht initialisiert werden kann, ruft die Klasse EmojiCompat
die Methode onFailed()
auf.
Sie können den Initialisierungsstatus jederzeit prüfen, indem Sie die Methode getLoadState()
aufrufen. Es wird einer der folgenden Werte zurückgegeben: LOAD_STATE_LOADING
, LOAD_STATE_SUCCEEDED
oder LOAD_STATE_FAILED
.
EmojiCompat mit AppCompat-Widgets verwenden
Wenn du AppCompat widgets
verwendest, kannst du EmojiCompat
-Widgets verwenden, die von AppCompat widgets
reichen.
- Fügen Sie die Supportbibliothek dem Abschnitt für Abhängigkeiten hinzu.
Cool
dependencies { ... implementation "androidx.emoji:emoji-bundled:$version" }
Kotlin
dependencies { implementation("androidx.emoji:emoji-appcompat:$version") }
Cool
dependencies { implementation "androidx.emoji:emoji-appcompat:$version" }
- Verwende
EmojiCompat
AppCompat Widget
-Widgets in Layout-XMLs.
<android.support.text.emoji.widget.EmojiAppCompatTextView android:layout_width="wrap_content" android:layout_height="wrap_content"/> <android.support.text.emoji.widget.EmojiAppCompatEditText android:layout_width="wrap_content" android:layout_height="wrap_content"/> <android.support.text.emoji.widget.EmojiAppCompatButton android:layout_width="wrap_content" android:layout_height="wrap_content"/>
Gebündelte Schriftarten konfigurieren
Die EmojiCompat
-Supportbibliothek ist auch in einer gebündelten Schriftartversion verfügbar. Dieses Paket enthält die Schriftart mit den eingebetteten Metadaten. Das Paket enthält auch ein BundledEmojiCompatConfig
, das die Metadaten und Schriftarten mithilfe von AssetManager
lädt.
Hinweis:Die Schriftgröße wird in mehreren Megabyte angegeben.
Abhängigkeit von Supportbibliothek hinzufügen
Wenn Sie die EmojiCompat
-Supportbibliothek mit gebündelter Schriftartkonfiguration verwenden möchten, müssen Sie die Klassenpfadabhängigkeiten Ihres Anwendungsprojekts innerhalb Ihrer Entwicklungsumgebung ändern.
So fügen Sie Ihrem Anwendungsprojekt eine Supportbibliothek hinzu:
- Öffnen Sie die Datei
build.gradle
Ihrer Anwendung. - Fügen Sie die Supportbibliothek zum Abschnitt
dependencies
hinzu.
Cool
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Gebündelte Schriftarten zum Konfigurieren von EmojiCompat verwenden
So verwenden Sie gebündelte Schriftarten zum Konfigurieren von EmojiCompat
:
- Verwenden Sie
BundledEmojiCompatConfig
, um eine Instanz vonEmojiCompat
zu erstellen und eine Instanz vonContext
anzugeben. - Rufen Sie die Methode
init()
auf, umEmojiCompat
zu initialisieren und die Instanz vonBundledEmojiCompatConfig
zu übergeben.
Kotlin
class MyApplication : Application() { override fun onCreate() { super.onCreate() val config = BundledEmojiCompatConfig(this) EmojiCompat.init(config) } }
Java
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); EmojiCompat.Config config = new BundledEmojiCompatConfig(this); EmojiCompat.init(config); ... } }
EmojiCompat ohne Widgets verwenden
EmojiCompat
verwendet EmojiSpan
, um korrekte Bilder zu rendern.
Daher muss er eine gegebene CharSequence
-Instanz mit EmojiSpans
in Spanned
-Instanzen konvertieren. Die Klasse EmojiCompat
bietet eine Methode zum Konvertieren von CharSequences
in Spanned
-Instanzen mit EmojiSpans
. Mit dieser Methode können Sie die verarbeiteten Instanzen anstelle des Rohstrings verarbeiten und im Cache speichern, wodurch die Leistung Ihrer Anwendung verbessert wird.
Kotlin
val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
Java
CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");
EmojiCompat für IMEs verwenden
Mithilfe der EmojiCompat
-Supportbibliothek können Tastaturen die Emojis rendern, die von der Anwendung unterstützt werden, mit der sie interagieren. IMEs können mit der Methode hasEmojiGlyph()
prüfen, ob EmojiCompat
ein Emoji rendern kann. Diese Methode verwendet ein CharSequence
eines Emojis und gibt true
zurück, wenn EmojiCompat
das Emoji erkennen und rendern kann.
Die Tastatur kann auch die von der App unterstützte Version der EmojiCompat
-Supportbibliothek prüfen, um zu bestimmen, welches Emoji in der Palette gerendert werden soll. Um die Version zu prüfen (falls verfügbar), muss die Tastatur prüfen, ob die folgenden Schlüssel im EditorInfo.extras
-Bundle vorhanden sind:
EDITOR_INFO_METAVERSION_KEY
EDITOR_INFO_REPLACE_ALL_KEY
Wenn der Schlüssel im Bundle vorhanden ist, stellt der Wert die Version der Emoji-Metadaten dar, die die App verwendet. Wenn dieser Schlüssel nicht vorhanden ist, verwendet die Anwendung EmojiCompat
nicht.
Wenn der Schlüssel vorhanden und auf true
festgelegt ist, bedeutet dies, dass die Anwendung die Methode SetReplaceAll()
aufgerufen hat. Weitere Informationen zur EmojiCompat
-Konfiguration finden Sie im Abschnitt Konfigurationsoptionen.
Nach Empfang der Schlüssel im EditorInfo.extras
-Bundle kann die Tastatur die hasEmojiGlyph()
-Methode verwenden, wobei metadataVersion
der Wert für EDITOR_INFO_METAVERSION_KEY
ist, um zu prüfen, ob die App ein bestimmtes Emoji rendern kann.
EmojiCompat mit benutzerdefinierten Widgets verwenden
Sie können die Methode process()
jederzeit verwenden, um CharSequence
in Ihrer Anwendung vorzuverarbeiten und sie jedem Widget hinzuzufügen, das Spanned
-Instanzen rendern kann, z. B. TextView
. Darüber hinaus bietet EmojiCompat
die folgenden Widget-Hilfsklassen, damit Sie Ihre benutzerdefinierten Widgets mit minimalem Aufwand mit Emoji-Unterstützung ergänzen können.
- Beispiel-Textansicht
- Beispiel für EditText
Kotlin
class MyTextView(context: Context) : AppCompatTextView(context) { private val emojiTextViewHelper: EmojiTextViewHelper by lazy(LazyThreadSafetyMode.NONE) { EmojiTextViewHelper(this).apply { updateTransformationMethod() } } override fun setFilters(filters: Array<InputFilter>) { super.setFilters(emojiTextViewHelper.getFilters(filters)) } override fun setAllCaps(allCaps: Boolean) { super.setAllCaps(allCaps) emojiTextViewHelper.setAllCaps(allCaps) } }
Java
public class MyTextView extends AppCompatTextView { ... public MyTextView(Context context) { super(context); init(); } ... private void init() { getEmojiTextViewHelper().updateTransformationMethod(); } @Override public void setFilters(InputFilter[] filters) { super.setFilters(getEmojiTextViewHelper().getFilters(filters)); } @Override public void setAllCaps(boolean allCaps) { super.setAllCaps(allCaps); getEmojiTextViewHelper().setAllCaps(allCaps); } private EmojiTextViewHelper getEmojiTextViewHelper() { ... } }
Kotlin
class MyEditText(context: Context) : AppCompatEditText(context) { private val emojiEditTextHelper: EmojiEditTextHelper by lazy(LazyThreadSafetyMode.NONE) { EmojiEditTextHelper(this).also { super.setKeyListener(it.getKeyListener(keyListener)) } } override fun setKeyListener(input: KeyListener?) { input?.also { super.setKeyListener(emojiEditTextHelper.getKeyListener(it)) } } override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection { val inputConnection: InputConnection = super.onCreateInputConnection(outAttrs) return emojiEditTextHelper.onCreateInputConnection( inputConnection, outAttrs ) as InputConnection } }
Java
public class MyEditText extends AppCompatEditText { ... public MyEditText(Context context) { super(context); init(); } ... private void init() { super.setKeyListener(getEmojiEditTextHelper().getKeyListener(getKeyListener())); } @Override public void setKeyListener(android.text.method.KeyListener keyListener) { super.setKeyListener(getEmojiEditTextHelper().getKeyListener(keyListener)); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { InputConnection inputConnection = super.onCreateInputConnection(outAttrs); return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs); } private EmojiEditTextHelper getEmojiEditTextHelper() { ... } }
Häufig gestellte Fragen
- Wie starte ich den Download einer Schriftart?
- Wie lange dauert die Initialisierung?
- Wie viel Speicher nutzt die EmojiCompat-Supportbibliothek?
- Kann ich EmojiCompat für eine benutzerdefinierte TextView verwenden?
- Was passiert, wenn ich Widgets in Layout-XMLs auf Geräten mit Android 4.4 (API-Level 19) oder niedriger hinzufüge?
Die Emoji-Schriftarten werden bei der ersten Anfrage heruntergeladen, falls sie nicht auf dem Gerät vorhanden sind. Die Downloadplanung ist für die App transparent.
Nach dem Herunterladen der Schriftart dauert es etwa 150 Millisekunden, bis EmojiCompat
initialisiert wird.
Aktuell wird die Datenstruktur zum Finden des Emojis in den Arbeitsspeicher der App geladen und belegt etwa 200 KB.
Ja. EmojiCompat bietet Hilfsklassen für benutzerdefinierte Widgets. Es ist auch möglich, einen bestimmten String vorzuverarbeiten und in Spanned
umzuwandeln. Weitere Informationen zu Widget-Hilfsklassen finden Sie im Abschnitt EmojiCompat mit benutzerdefinierten Widgets verwenden.
Du kannst die EmojiCompat
-Supportbibliothek oder die zugehörigen Widgets in Apps einbinden, die Geräte mit Android 4.4 (API-Level 19) oder niedriger unterstützen. Wenn auf dem Gerät jedoch eine Android-Version vor API-Level 19 ausgeführt wird, befinden sich EmojiCompat
und die zugehörigen Widgets im Status „Kein Vorgang“. Das bedeutet, dass sich EmojiTextView
genau wie ein reguläres TextView
verhält.
EmojiCompat
-Instanz hinzu. Sie wechselt sofort in den Status LOAD_STATE_SUCCEEDED
, wenn Sie die Methode init()
aufrufen.
Zusätzliche Ressourcen
Weitere Informationen zur Verwendung der EmojiCompat
-Mediathek findest du unter EmojiCompat.