Standardowy zestaw emotikonów jest co roku odświeżany przez Unicode, ponieważ coraz więcej emotikonów jest używanych we wszystkich typach aplikacji.
Jeśli Twoja aplikacja wyświetla treści internetowe lub umożliwia wprowadzanie tekstu, zdecydowanie zalecamy obsługę najnowszych czcionek emotikonów. W przeciwnym razie później emotikony mogą być wyświetlane jako małe kwadratowe pole o nazwie tofu (widocznego) lub inne nieprawidłowo wyrenderowane sekwencje emotikonów.
Android w wersji 11 (poziom interfejsu API 30) i starszych nie może zaktualizować czcionki emotikonów, dlatego aplikacje, które wyświetlają je w tych wersjach, należy zaktualizować ręcznie.
Oto przykłady nowoczesnych emotikonów.
Przykłady | Wersja |
---|---|
🫠 🫱🏼🫲🏿 🫰🏽 | 14.0 (wrzesień 2021 r.) |
😶🌫️ 🧔🏻♀️ 🧑🏿❤️🧑🏾 | 13.1 (wrzesień 2020 r.) |
🥲 🥷🏿 🐻❄️ | 13.0 (marzec 2020 r.) |
🧑🏻🦰 🧑🏿🦯 👩🏻🤝👩🏼 | 12.1 (październik 2019 r.) |
🦩 🦻🏿 👩🏼🤝👩🏻 | 12.0 (luty 2019 r.) |
Biblioteka androidx.emoji2:emoji2
zapewnia prostszą zgodność wsteczną z starszymi wersjami Androida. Biblioteka emoji2
jest zależność od biblioteki AppCompat
i nie wymaga dodatkowej konfiguracji.
Obsługa emotikonów w funkcji tworzenia wiadomości
BOM marca 2023 r. (Compose UI 1.4) zapewnia obsługę najnowszej wersji emotikonów, w tym zgodność wsteczną ze starszymi wersjami Androida aż do interfejsu API 21. Na tej stronie dowiesz się, jak skonfigurować nowoczesne emotikony w systemie widoków. Więcej informacji znajdziesz na stronie Emotikony w oknie tworzenia wiadomości.
Wymagania wstępne
Aby sprawdzić, czy aplikacja prawidłowo wyświetla nowsze emotikony, uruchom ją na urządzeniu z Androidem 10 (poziom interfejsu API 29) lub niższym. Znajdziesz tam nowoczesne emotikony, które możesz wyświetlać w ramach testów.
Korzystanie z AppCompat w celu obsługi najnowszych emotikonów
AppCompat
Wersja 1.4 zapewnia obsługę emotikonów.
Aby używać AppCompat
do obsługi emotikonów, wykonaj te czynności:
Sprawdź, czy moduł korzysta z biblioteki
AppCompat
w wersji 1.4.0-alpha01 lub nowszej.build.gradle // Ensure version is 1.4.0-alpha01 or higher. implementation "androidx.appcompat:appcompat.$appcompatVersion"
Upewnij się, że wszystkie działania, które wyświetlają tekst, rozszerzają klasę
AppCompatActivity
.Kotlin
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Java
MyActivity.java class MyActivity extends AppCompatActivity { ... }
Przetestuj integrację, uruchamiając aplikację na urządzeniu z Androidem 10 lub starszym i wyświetlając ten ciąg testowy. Sprawdź, czy wszystkie znaki renderują się poprawnie.
- 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻 🥳
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Aplikacja automatycznie wyświetla zgodne wstecznie emotikony na wszystkich urządzeniach udostępniających dostawcę czcionek do pobrania zgodnej z emoji2
, np. na urządzeniach z Usługami Google Play.
Jeśli aplikacja korzysta z AppCompat, ale wyświetla tofu (widocznego)
W niektórych przypadkach aplikacja może wyświetlać tofu zamiast odpowiednich emotikonów, nawet jeśli dodasz bibliotekę AppCompat
. Poniżej znajdziesz możliwe wyjaśnienia i rozwiązania.
Używasz aplikacji na urządzeniu z niedawno zainstalowaną aktualizacją lub nowym emulatorze
Wyczyść dane aplikacji Usługi Google Play, aby wyczyścić pamięć podręczną czcionek, które mogły wystąpić podczas uruchamiania aplikacji. To zwykle rozwiązuje problem w ciągu kilku godzin.
Aby wyczyścić dane aplikacji:
Otwórz Ustawienia na urządzeniu z Androidem.
Kliknij Aplikacje i powiadomienia.
Kliknij Wyświetl wszystkie aplikacje lub Informacje o aplikacji.
Przewiń listę aplikacji i kliknij Usługi Google Play.
Kliknij Pamięć wewnętrzna i podręczna.
Kliknij Wyczyść pamięć podręczną.
Twoja aplikacja nie używa klasy tekstowej AppCompat
Może się tak zdarzyć, jeśli nie rozszerzysz zakresu AppCompatActivity
lub jeśli utworzysz instancję widoku w kodzie, np. TextView
. Sprawdź, czy:
- Aktywność obejmuje okres
AppCompatActivity
. - Jeśli tworzysz widok w kodzie, użyj właściwej podklasy
AppCompat
.
Podczas tworzenia pliku XML AppCompatActivity
automatycznie dodaje AppCompatTextView
w miejscu TextView
, dzięki czemu nie musisz aktualizować pliku XML.
Telefon testowy nie obsługuje czcionek do pobrania
Sprawdź, czy DefaultEmojiCompatConfig.create
zwraca konfigurację niepustą.
Emulator na wcześniejszym poziomie interfejsu API nie uaktualnił Usług Google Play
Jeśli używasz emulatora na wcześniejszym poziomie interfejsu API, może być konieczne zaktualizowanie pakietu Usług Google Play dla emoji2
, aby znaleźć dostawcę czcionki. Aby to zrobić, zaloguj się w Sklepie Google Play w emulatorze.
Aby sprawdzić, czy zainstalowana jest zgodna wersja, wykonaj te czynności:
Uruchom to polecenie:
adb shell dumpsys package com.google.android.gms | grep version
Sprawdź, czy
versionCode
ma wartość większą niż211200000
.
Obsługa emotikonów bez AppCompat
Jeśli aplikacja nie może zawierać elementu AppCompat
, może bezpośrednio używać emoji2
. Wymaga to więcej pracy, więc używaj tej metody tylko wtedy, gdy Twoja aplikacja nie może używać metody AppCompat
.
Aby obsługiwać emotikony bez biblioteki AppCompat
, wykonaj te czynności:
W pliku
build.gradle
aplikacji umieśćemoji2
iemoji2-views
.build.gradle def emojiVersion = "1.0.0-alpha03" implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-views:$emojiVersion"
Moduł
emoji2-views
zawiera podklasyTextView
,Button
iEditText
, które implementująEmojiCompat
. Nie używaj go w aplikacji, która zawieraAppCompat
, ponieważ zawiera już onaEmojiCompat
.W kodzie XML i kodzie tam, gdzie używasz
TextView
,EditText
lubButton
, użyj zamiast niegoEmojiTextView
,EmojiEditText
lubEmojiButton
.activity_main.xml <androidx.emoji2.widget.EmojiTextView ... /> <androidx.emoji2.widget.EmojiEditText ... /> <androidx.emoji2.widget.EmojiButton ... />
Dzięki dodaniu modułu
emoji2
system używa domyślnego dostawcy czcionek do pobrania, aby automatycznie ładować czcionkę emotikonów tuż po uruchomieniu aplikacji. Nie musisz niczego konfigurować.Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 11 lub starszym i wyświetl poniższe ciągi testowe. Sprawdź, czy wszystkie znaki renderują się poprawnie.
- 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻 🥳
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Używaj emotikonów bez widżetów
Do renderowania prawidłowych obrazów EmojiCompat
używa narzędzia EmojiSpan
. Dlatego musi przekonwertować dowolny obiekt CharSequence
na obiekt Spanned
z EmojiSpan
obiektami.
Klasa EmojiCompat udostępnia metodę process()
, która pozwala przekonwertować CharSequences
na wystąpienia Spanned
. Korzystając z tej metody, możesz wywoływać process()
w tle i zapisywać wyniki w pamięci podręcznej, co poprawia wydajność aplikacji.
Kotlin
val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
Java
CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");
Używaj atrybutu EmojiCompat w edytorach metody wprowadzania
Klasa EmojiCompat
pozwala klawiaturom renderować emotikony obsługiwane przez aplikację, z której korzystają. Edytorzy metod wprowadzania (IME) mogą używać metody getEmojiMatch()
do sprawdzania, czy wystąpienie elementu EmojiCompat
może wyrenderować emotikon. Ta metoda pobiera CharSequence
emotikona i zwraca true
, jeśli EmojiCompat
potrafi wykryć i wyrenderować emotikon.
Aby określić, które emotikony mają być renderowane w palecie, klawiatura może również sprawdzić wersję EmojiCompat
obsługiwaną przez aplikację. Aby sprawdzić wersję, klawiatura może wyszukiwać te klawisze w pakiecie EditorInfo.extras
:
EDITOR_INFO_METAVERSION_KEY
: reprezentuje wersję metadanych emotikonów używanych przez aplikację. Jeśli ten klucz nie istnieje, oznacza to, że aplikacja nie używa kluczaEmojiCompat
.EDITOR_INFO_REPLACE_ALL_KEY
: jeśli klucz istnieje i ma wartośćtrue
, aplikacja konfigurujeEmojiCompat
w taki sposób, aby zastępowała wszystkie emotikony, nawet jeśli są one dostępne w systemie.
Dowiedz się więcej o konfigurowaniu instancji EmojiCompat.
Używanie emotikonów w widokach niestandardowych
Jeśli Twoja aplikacja ma widoki niestandardowe, które są bezpośrednimi lub pośrednimi podklasami kategorii TextView
, np. Button
, Switch
lub EditText
, i mogą wyświetlać treści użytkowników, każde z nich musi implementować EmojiCompat
.
Ten proces różni się w zależności od tego, czy aplikacja korzysta z biblioteki AppCompat
.
Dodawanie widoków niestandardowych dla aplikacji za pomocą AppCompat
Jeśli Twoja aplikacja używa AppCompat
, rozszerz implementację AppCompat
zamiast implementacji platformy. Aby dowiedzieć się, jak rozszerzyć widoki w AppCompat
, skorzystaj z tej tabeli:
Zamiast przedłużać... | Przedłuż |
---|---|
TextView
|
AppCompatTextView
|
EditText
|
AppCompatEditText
|
ToggleButton
|
AppCompatToggleButton
|
Switch
|
SwitchCompat
|
Button
|
AppCompatButton
|
CheckedTextView
|
AppCompatCheckedTextView
|
RadioButton
|
AppCompatRadioButton
|
CheckBox
|
AppCompatCheckBox
|
AutoCompleteTextView
|
AppCompatAutoCompleteTextView
|
MultiAutoCompleteTextView
|
AppCompatMultiAutoCompleteTextView
|
Dodawanie widoków niestandardowych dla aplikacji bez AppCompat
Jeśli Twoja aplikacja nie używa AppCompat
, skorzystaj z pomocy w integracji widoków w module emoji2-views-helper
przeznaczonych do stosowania w widokach niestandardowych. Biblioteka AppCompat
używa tych funkcji do wdrażania obsługi emotikonów.
Aby zapewnić obsługę widoków niestandardowych w aplikacjach, które nie korzystają z AppCompat
, wykonaj te czynności.
Dodaj bibliotekę
emoji2-views-helper
:implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
Wykonaj instrukcje dodawania
EmojiTextViewHelper
lubEmojiEditTextHelper
do widoków niestandardowych aplikacji.Przetestuj integrację, uruchamiając aplikację na urządzeniu z Androidem 10 lub starszym i wyświetlając ten ciąg testowy. Sprawdź, czy wszystkie znaki renderują się poprawnie.
- 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻 🥳
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Opcjonalne funkcje obsługi emotikonów2
Po dodaniu biblioteki emoji2
do aplikacji możesz dodawać opcjonalne funkcje opisane w tej sekcji.
Konfigurowanie emotikonów2, aby używać innej czcionki lub czcionki do pobrania
Aby skonfigurować w emoji2
korzystanie z innego dostawcy czcionek lub czcionek do pobrania, wykonaj te czynności:
Wyłącz
EmojiCompatInitializer
, dodając do pliku manifestu ten kod:<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" tools:node="remove" /> </provider>
Wykonać jedną z tych czynności:
Aby użyć konfiguracji domyślnej, wywołaj metodę
DefaultEmojiCompatConfiguration.create(context)
.Utwórz własną konfigurację, aby wczytać czcionki z innego źródła za pomocą metody
EmojiCompat.Config
. Ta klasa udostępnia kilka opcji modyfikowania działaniaEmojiCompat
zgodnie z opisem w następnej sekcji.
Zmienianie działania EmojiCompat
Aby zmodyfikować działanie EmojiCompat
, możesz użyć instancji EmojiCompat.Config
.
Najważniejszą opcją konfiguracji jest setMetadataLoadStrategy()
, która określa, kiedy EmojiCompat
wczytuje czcionkę. Ładowanie czcionki rozpoczyna się natychmiast po wywołaniu funkcji EmojiCompat.load()
i powoduje uruchomienie pobierania. System utworzy wątek pobierania czcionki, chyba że aplikacja go udostępnia.
LOAD_STRATEGY_MANUAL
pozwala określić, kiedy ma być wywoływane EmojiCompat.load()
, a LOAD_STRATEGY_DEFAULT
sprawia, że wczytywanie jest synchroniczne w trakcie wywołania EmojiCompat.init()
.
Większość aplikacji używa LOAD_STRATEGY_MANUAL
, dzięki któremu mogą kontrolować wątek i czas wczytywania czcionki. Aby uniknąć opóźnienia podczas uruchamiania, aplikacja musi zostać opóźniona do momentu wyświetlenia pierwszego ekranu. EmojiCompatInitializer
stosuje tę praktykę i opóźnia wczytywanie czcionki emotikonów do momentu wznowienia pierwszego ekranu.
Aby ustawić inne aspekty konfiguracji, użyj tych metod z klasy podstawowej:
setReplaceAll()
: określa, czyEmojiCompat
zastępuje wszystkie znalezione emotikony wystąpieniamiEmojiSpan
. Domyślnie, gdyEmojiCompat
ustali, że system może wyrenderować emotikon, nie zastąpi go domyślnie. Gdy ma wartośćtrue
,EmojiCompat
zastępuje wszystkie emotikonyEmojiSpan
obiektami.setEmojiSpanIndicatorEnabled()
: wskazuje, czyEmojiCompat
zastępuje emotikon obiektemEmojiSpan
. Gdy zasada ma wartośćtrue
,EmojiCompat
rysuje tło dlaEmojiSpan
. Ta metoda jest używana głównie do debugowania.setEmojiSpanIndicatorColor
: ustawia kolor naEmojiSpan
. Wartość domyślna toGREEN
.registerInitCallback()
: informuje aplikację o stanie inicjowaniaEmojiCompat
.
Dodaj detektory inicjowania
Klasy EmojiCompat
i EmojiCompat.Config
udostępniają metody registerInitCallback()
i unregisterInitCallback()
do rejestrowania i wyrejestrowania wywołań zwrotnych inicjowania. Twoja aplikacja używa tych wywołań zwrotnych, aby czekać na zainicjowanie EmojiCompat
, zanim przetworzysz emotikony w wątku w tle lub w widoku niestandardowym.
Aby korzystać z tych metod, utwórz instancję klasy EmojiCompat.InitCallback
. Wywołaj te metody i przekaż wystąpienie klasy EmojiCompat.InitCallback
. Jeśli inicjowanie się powiedzie, klasa EmojiCompat
wywołuje metodę onInitialized()
. Jeśli biblioteki nie uda się zainicjować, klasa EmojiCompat
wywoła metodę onFailed()
.
Aby w dowolnym momencie sprawdzić stan inicjowania, wywołaj metodę getLoadState()
. Ta metoda zwraca jedną z tych wartości: LOAD_STATE_LOADING
, LOAD_STATE_SUCCEEDED
lub LOAD_STATE_FAILED
.
Obsługuj pakiety czcionek za pomocą emotikonów2
Za pomocą artefaktu emoji2-bundled
możesz dodać czcionkę emotikonów do swojej aplikacji.
Jednak ponieważ rozmiar czcionki NotoColorEmoji
przekracza 10 MB, zdecydowanie zalecamy, aby w miarę możliwości używać czcionek do pobrania w aplikacji. Artefakt emoji2-bundled
jest przeznaczony dla aplikacji na urządzenia, które nie obsługują czcionek do pobrania.
Aby użyć artefaktu emoji2-bundled
, wykonaj te czynności:
Uwzględnij
emoji2-bundled
iemoji2
artefaktów:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
Skonfiguruj
emoji2
tak, aby korzystał z konfiguracji zawartej w pakiecie:Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Przetestuj integrację, wykonując powyższe czynności, aby uwzględnić właściwość
emojicompat
z elementemAppCompat
lub bez niego. Sprawdź, czy ciąg testowy wyświetla się poprawnie.- 14.0: 🫠, 🫱🏼 🫲🏿, 🫰🏽
- 13.1: 😶 🌫️, 🧔🏻 ♀️, 🧑🏿 ❤️ 🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻 🥳
- 12.1: 🧑🏻 🦰, 🧑🏿 🦯, 👩🏻 🤝 👩🏼
- 12,0: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Wpływ automatycznej konfiguracji EmojiCompat
System zastosuje domyślną konfigurację za pomocą biblioteki startowej EmojiCompatInitializer
i DefaultEmojiCompatConfig
.
Po wznowieniu pierwszej aktywności w aplikacji inicjator planuje wczytywanie czcionek emotikonów. Dzięki temu krótkiemu opóźnieniu aplikacja może wyświetlić początkową treść bez żadnych opóźnień spowodowanych wczytywaniem czcionki w wątku w tle.
DefaultEmojiCompatConfig
szuka zainstalowanego przez system dostawcy czcionek, który implementuje interfejs EmojiCompat
, np. Usługi Google Play. Na urządzeniach z Usługami Google Play czcionki są wczytywane za pomocą Usług Google Play.
Inicjator tworzy wątek w tle w celu wczytania czcionki emotikonów, a jej pobieranie może potrwać do 10 sekund. Po pobraniu czcionki inicjowanie EmojiCompat
w wątku w tle trwa około 150 milisekund.
Odłóż inicjowanie EmojiCompat
, nawet jeśli wyłączysz EmojiCompatInitializer
. Jeśli skonfigurujesz EmojiCompat
ręcznie, wywołaj metodę EmojiCompat.load()
po wyświetleniu pierwszego ekranu aplikacji, aby uniknąć rywalizacji w tle przy pierwszym wczytaniu ekranu.
Po wczytaniu aplikacja EmojiCompat
używa około 300 KB pamięci RAM do przechowywania metadanych emotikonów.