Standardowy zestaw emotikonów jest odświeżany corocznie przez Unicode, ponieważ ich użycie w różnych aplikacjach szybko rośnie.
Jeśli Twoja aplikacja wyświetla treści internetowe lub umożliwia wprowadzanie tekstu, zalecamy obsługę najnowszych czcionek emoji. W przeciwnym razie późniejsze emotikony mogą być wyświetlane jako małe kwadratowe pole o nazwie tofu (☐) lub inne nieprawidłowo renderowane sekwencje emotikonów.
Aplikacje na Androidzie w wersji 11 (poziom interfejsu API 30) i starszych nie mogą aktualizować czcionki emotikonów, więc aplikacje, które wyświetlają je w tych wersjach, muszą zostać zaktualizowane ręcznie.
Poniżej znajdziesz 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 niższymi wersjami Androida. Biblioteka emoji2
jest zależnością biblioteki AppCompat
i nie wymaga dalszej konfiguracji.
Obsługa emotikonów w sekcji „Tworzenie”
BOM z marca 2023 r. (interfejs tworzenia wiadomości 1.4) zawiera obsługę najnowszej wersji emotikonów, w tym zgodność z wersjami Androida od API 21 w stecz. Na tej stronie znajdziesz informacje o konfigurowaniu współczesnych emotikonów w systemie View. Więcej informacji znajdziesz na stronie Emotikony w komponowaniu wiadomości.
Wymagania wstępne
Aby sprawdzić, czy aplikacja prawidłowo wyświetla nowsze emotikony, uruchom ją na urządzeniu z Androidem 10 (poziom API 29) lub niższym. Ta strona zawiera nowoczesne emotikony, które możesz wyświetlić w celu przetestowania.
Obsługa najnowszych emotikonów za pomocą AppCompat
AppCompat
1.4 zawiera obsługę emotikonów.
Aby używać AppCompat
do obsługi emotikonów:
Sprawdź, czy moduł jest zależny od 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 zadania, które wyświetlają tekst, rozszerzają
AppCompatActivity
klasę.Kotlin
MyActivity.kt class MyActivity: AppCompatActivity { ... }
Java
MyActivity.java class MyActivity extends AppCompatActivity { ... }
Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 10 lub starszym i wyświetl ten ciąg testowy. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Twoja aplikacja automatycznie wyświetla zgodne z poprzednimi wersjami emoji na wszystkich urządzeniach, które udostępniają dostawcę czcionek do pobrania zgodnego z emoji2
, takich jak urządzenia z Usługami Google Play.
Jeśli Twoja aplikacja używa AppCompat, ale wyświetla tofu (☐)
W niektórych przypadkach aplikacja może wyświetlić tofu zamiast odpowiedniego emoji, nawet jeśli dodasz bibliotekę AppCompat
. Poniżej znajdziesz możliwe wyjaśnienia i rozwiązania.
Uruchom aplikację na urządzeniu, na którym niedawno przeflashowano oprogramowanie, lub na nowym emulatorze.
Wyczyść dane Usług Google Play aplikacji, aby usunąć pamięć podręczną czcionek, która może być używana podczas uruchamiania. Zwykle problem znika po kilku godzinach.
Aby wyczyścić dane aplikacji:
Na urządzeniu z Androidem otwórz Ustawienia.
Kliknij Aplikacje i powiadomienia.
Kliknij Wyświetl wszystkie aplikacje lub Informacje o aplikacji.
Przewiń listę aplikacji i kliknij Usługi Google Play.
Kliknij Pamięć urządzenia i pamięć podręczna.
Kliknij Wyczyść pamięć podręczną.
Twoja aplikacja nie używa klasy związanej z tekstem w AppCompat
Może się tak zdarzyć, jeśli nie rozszerzysz klasy AppCompatActivity
lub jeśli w kodzie utworzysz instancję widoku, np. TextView
. Sprawdź te kwestie:
- Aktywność trwa
AppCompatActivity
. - Jeśli tworzysz widok w kodzie, użyj odpowiedniej podklasy
AppCompat
.
AppCompatActivity
automatycznie wypełnia AppCompatTextView
zamiast
TextView
podczas wypełniania pliku XML, więc nie musisz aktualizować pliku XML.
Testowy telefon nie obsługuje czcionek do pobrania
Sprawdź, czy funkcja DefaultEmojiCompatConfig.create
zwraca konfigurację inną niż null.
Emulator na starszym poziomie interfejsu API nie uaktualnił Usług Google Play
Jeśli używasz emulatora na niższym poziomie interfejsu API, konieczne może być zaktualizowanie pakietu Usługi Google Play w wersji emoji2
, aby znaleźć dostawcę czcionek. Aby to zrobić, zaloguj się w Sklepie Google Play na 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
jest większa niż211200000
.
Obsługa emotikonów bez AppCompat
Jeśli Twoja aplikacja nie może zawierać AppCompat
, może bezpośrednio używać emoji2
. Wymaga to więcej pracy, dlatego stosuj tę metodę tylko wtedy, gdy aplikacja nie może używać AppCompat
.
Aby obsługiwać emotikony bez biblioteki AppCompat
:
W pliku
build.gradle
aplikacji dodaj elementyemoji2
iemoji2-views
.build.gradle def emojiVersion = "1.0.0-alpha03" implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-views:$emojiVersion"
Moduł
emoji2-views
udostępnia podklasyTextView
,Button
iEditText
, które implementują interfejsEmojiCompat
. Nie używaj go w aplikacji, która zawieraAppCompat
, ponieważ implementuje ona jużEmojiCompat
.W pliku XML i kodzie – wszędzie tam, gdzie używasz wartości
TextView
,EditText
lubButton
– użyj zamiast nich wartościEmojiTextView
,EmojiEditText
lubEmojiButton
.activity_main.xml <androidx.emoji2.widget.EmojiTextView ... /> <androidx.emoji2.widget.EmojiEditText ... /> <androidx.emoji2.widget.EmojiButton ... />
Dzięki dołączeniu modułu
emoji2
system używa domyślnego pobieranego fontu emotikonów, który jest automatycznie wczytywany zaraz po uruchomieniu aplikacji. Nie jest wymagana żadna dodatkowa konfiguracja.Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem w wersji 11 lub nowszej i wyświetl te ciągi tekstowe testowe. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Korzystanie z EmojiCompat bez widżetów
EmojiCompat
używa EmojiSpan
do renderowania prawidłowych obrazów. Dlatego musi przekształcić dowolny obiekt CharSequence
w obiekt Spanned
z obiektami EmojiSpan
.
Klasa EmojiCompat udostępnia metodę process()
, która umożliwia konwertowanie obiektów CharSequences
na instancje Spanned
. Dzięki tej metodzie możesz wywoływać funkcję process()
w tle i przechowywać w pamięci podręcznej wyniki, 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żywanie EmojiCompat w przypadku edytorów metody wprowadzania
Klasa EmojiCompat
umożliwia klawiaturom renderowanie emotikonów obsługiwanych przez aplikację, z którą się komunikują. Edytory metody wprowadzania (IME) mogą używać metody getEmojiMatch()
, aby sprawdzić, czy instancja EmojiCompat
jest w stanie wyświetlić emotikon. Ta metoda przyjmuje CharSequence
emotikona i zwraca true
, jeśli EmojiCompat
może wykryć i wyrenderować emotikona.
Klawiatura może też sprawdzić wersję EmojiCompat
, którą obsługuje aplikacja, aby określić, które emotikony mają być renderowane w palecie. Aby sprawdzić wersję, klawiatura może w pakiecie EditorInfo.extras
szukać te klawisze:
EDITOR_INFO_METAVERSION_KEY
: reprezentuje wersję metadanych emotikonów, której używa aplikacja. Jeśli ten klucz nie istnieje, aplikacja nie korzysta zEmojiCompat
.EDITOR_INFO_REPLACE_ALL_KEY
: jeśli klucz istnieje i jest ustawiony na wartośćtrue
, aplikacja konfigurujeEmojiCompat
, aby zastąpić wszystkie emotikony, nawet jeśli są one obecne 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 widoku TextView
(np. Button
, Switch
lub EditText
), a te widoki mogą wyświetlać treści utworzone przez użytkowników, każdy z nich musi implementować interfejs EmojiCompat
.
Proces różni się w zależności od tego, czy Twoja aplikacja korzysta z biblioteki AppCompat
.
Dodawanie widoków niestandardowych dla aplikacji z AppCompat
Jeśli Twoja aplikacja korzysta z funkcji AppCompat
, rozszerz implementację AppCompat
, a nie implementację platformy. Aby dowiedzieć się, jak zwiększyć liczbę wyświetleń w sekcji AppCompat
, skorzystaj z tabeli poniżej:
Zamiast rozszerzania... | Rozwiń |
---|---|
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 obsługi AppCompat
Jeśli Twoja aplikacja nie korzysta z AppCompat
, użyj w jej module emoji2-views-helper
pomocników integracji widoku, które są przeznaczone do używania w widokach niestandardowych. To pomocnicze klasy, których biblioteka AppCompat
używa do obsługi emotikonów.
Aby obsługiwać widoki niestandardowe w przypadku aplikacji, które nie korzystają z funkcji AppCompat
:
Dodaj bibliotekę
emoji2-views-helper
:implementation "androidx.emoji2:emoji2-views-helper:$emojiVersion"
Postępuj zgodnie z instrukcjami, aby uwzględnić widoki niestandardowe
EmojiTextViewHelper
lubEmojiEditTextHelper
w widokach niestandardowych aplikacji.Aby przetestować integrację, uruchom aplikację na urządzeniu z Androidem 10 lub starszym i wyświetl ten ciąg testowy. Sprawdź, czy wszystkie znaki są renderowane prawidłowo.
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Opcjonalne funkcje obsługi emoji2
Po dodaniu do aplikacji biblioteki emoji2
możesz dodać opcjonalne funkcje opisane w tej sekcji.
Konfigurowanie emoji2 do używania innej czcionki lub dostawcy czcionek do pobrania
Aby skonfigurować emoji2
tak, aby używał innej czcionki lub dostawcy czcionek do pobrania, wykonaj te czynności:
Wyłącz
EmojiCompatInitializer
, dodając do pliku manifestu:<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>
Wykonaj jedną z tych czynności:
Użyj konfiguracji domyślnej, wywołując funkcję
DefaultEmojiCompatConfiguration.create(context)
.Utwórz własną konfigurację do wczytywania czcionek z innego źródła, używając
EmojiCompat.Config
. Ta klasa udostępnia kilka opcji modyfikacji zachowaniaEmojiCompat
, jak opisano w sekcji poniżej.
Modyfikowanie zachowania EmojiCompat
Możesz użyć instancji EmojiCompat.Config
, aby zmodyfikować zachowanie EmojiCompat
.
Najważniejszą opcją konfiguracji jest setMetadataLoadStrategy()
, która określa, kiedy EmojiCompat
ma wczytać czcionkę. Ładowanie czcionek rozpoczyna się, gdy wywołana zostanie funkcja EmojiCompat.load()
, co powoduje pobieranie niezbędnych plików. System tworzy wątek do pobierania czcionek, chyba że aplikacja udostępnia własny wątek.
LOAD_STRATEGY_MANUAL
pozwala kontrolować, kiedy wywoływana jest funkcja EmojiCompat.load()
, a LOAD_STRATEGY_DEFAULT
powoduje, że wczytywanie rozpoczyna się synchronicznie w wywołaniu funkcji EmojiCompat.init()
.
Większość aplikacji używa LOAD_STRATEGY_MANUAL
, aby kontrolować wątek i czas wczytywania czcionki. Aplikacja musi odczekać do wyświetlenia pierwszego ekranu, aby uniknąć opóźnienia uruchamiania. 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 bazowej:
setReplaceAll()
: określa, czyEmojiCompat
zastępuje wszystkie znalezione emotikony instancjamiEmojiSpan
. Domyślnie, gdyEmojiCompat
stwierdzi, że system może renderować emotikon, nie zastąpi go. Gdy ustawisz wartośćtrue
,EmojiCompat
zastąpi wszystkie emotikony obiektamiEmojiSpan
.setEmojiSpanIndicatorEnabled()
: wskazuje, czyEmojiCompat
zastępuje emotikon obiektemEmojiSpan
. Gdy ustawisz wartośćtrue
, funkcjaEmojiCompat
rysuje tło dla elementuEmojiSpan
. Ta metoda jest używana głównie do debugowania.setEmojiSpanIndicatorColor
: ustawia kolor wskazującyEmojiSpan
. Wartością domyślną jestGREEN
.registerInitCallback()
: informuje aplikację o stanie inicjalizacjiEmojiCompat
.
Dodawanie odbiorców zdarzeń inicjowania
Klasy EmojiCompat
i EmojiCompat.Config
udostępniają metody registerInitCallback()
i unregisterInitCallback()
do rejestrowania i wyrejestrowania wywołań zwrotnych inicjalizowania. Aplikacja używa tych funkcji wywołania zwrotnego, aby oczekiwać, aż EmojiCompat
zostanie zainicjowana, zanim przetworzysz emotikony w wątku w tle lub w widoku niestandardowym.
Aby używać tych metod, utwórz instancję klasy EmojiCompat.InitCallback
. Wywołuj te metody i przekaż instancję klasy EmojiCompat.InitCallback
. Po pomyślnym zainicjowaniu klasa EmojiCompat
wywołuje metodę onInitialized()
. Jeśli nie uda się zainicjować biblioteki, klasa EmojiCompat
wywoła metodę onFailed()
.
Aby w dowolnym momencie sprawdzić stan inicjalizacji, wywołaj metodę getLoadState()
. Ta metoda zwraca jedną z tych wartości:
LOAD_STATE_LOADING
,
LOAD_STATE_SUCCEEDED
lub
LOAD_STATE_FAILED
.
Obsługa czcionek w pakiecie z emoji2
Możesz użyć artefaktu emoji2-bundled
, aby dołączyć czcionkę emotikonów do aplikacji. Ponieważ czcionka NotoColorEmoji
zajmuje ponad 10 MB, zdecydowanie zalecamy, aby w miarę możliwości używać w aplikacji czcionek do pobrania. Element emoji2-bundled
jest przeznaczony do aplikacji na urządzeniach, które nie obsługują czcionek do pobrania.
Aby użyć artefaktu emoji2-bundled
:
Dołącz artefakty
emoji2-bundled
iemoji2
:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
Skonfiguruj
emoji2
, aby używać konfiguracji w pakiecie:Kotlin
EmojiCompat.init(BundledEmojiCompatConfig(context))
Java
EmojiCompat.init(new BundledEmojiCompatConfig(context));
Przetestuj integrację, wykonując poprzednie czynności dotyczące uwzględniania
emojicompat
zAppCompat
lub bez niego. Sprawdź, czy ciąg testowy jest wyświetlany prawidłowo.- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻❄️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Wpływ automatycznej konfiguracji EmojiCompat
System stosuje konfigurację domyślną za pomocą biblioteki startowej EmojiCompatInitializer
i DefaultEmojiCompatConfig
.
Po wznowieniu pierwszej aktywności w aplikacji inicjalizator zaplanował wczytanie czcionek emoji. To krótkie opóźnienie pozwala aplikacji wyświetlić początkową treść bez opóźnień spowodowanych wczytywaniem czcionek w wątku tła.
DefaultEmojiCompatConfig
szuka zainstalowanego w systemie dostawcy czcionek do pobrania, który implementuje interfejs EmojiCompat
, np. usługi Google Play. Na urządzeniach z Usługami Google Play czcionka jest wczytywana za pomocą Usług Google Play.
inicjator tworzy wątek w tle, aby wczytać czcionkę emotikonów, a wczytywanie czcionki może potrwać do 10 sekund, zanim zostanie przekroczony limit czasu. Po pobraniu czcionki inicjowanie EmojiCompat
zajmuje około 150 ms na wątku w tle.
Opóźnij inicjalizację EmojiCompat
, nawet jeśli wyłączysz EmojiCompatInitializer
. Jeśli ręcznie skonfigurujesz EmojiCompat
, wywołaj funkcję EmojiCompat.load()
po wyświetleniu pierwszego ekranu aplikacji, aby uniknąć korzystania z tła w czasie wczytywania pierwszego ekranu.
Po załadowaniu EmojiCompat
używa około 300 KB pamięci RAM na potrzeby przechowywania metadanych emoji.