Standardowy zestaw emotikonów jest odświeżany corocznie przez Unicode, ponieważ ich użycie w różnych aplikacjach szybko rośnie.
Jeśli aplikacja wyświetla treści internetowe lub umożliwia wpisywanie 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 (☐) lub jako 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, dlatego aplikacje, które wyświetlają je w tych wersjach, muszą zostać zaktualizowane 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 niższymi wersjami Androida. Biblioteka emoji2
zależy od 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ć na potrzeby testowania.
Używaj AppCompat do obsługi najnowszych emotikonów
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ą zajęcia
AppCompatActivity
.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 emotikony na wszystkich urządzeniach, które udostępniają pobierane czcionki zgodne z emoji2
, np. na urządzeniach 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. Zazwyczaj rozwiązuje to problem po kilku godzinach.
Aby wyczyścić dane aplikacji:
Otwórz Ustawienia w urządzeniu z systemem Android.
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 został zaktualizowany do 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
ma wartość większą 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 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
udostępnia podklasyTextView
,Button
iEditText
, które implementują interfejsEmojiCompat
. Nie używaj go w aplikacji, która zawiera dyrektywęAppCompat
, ponieważ zawiera ona już właściwośćEmojiCompat
.W pliku XML i kodzie tam, gdzie używasz właściwości
TextView
,EditText
lubButton
, użyj zamiast tego koduEmojiTextView
,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 pobieranego fontu emotikonów, który jest automatycznie wczytywany zaraz po uruchomieniu aplikacji. Nie jest potrzebna 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: 🦩, 🦻🏿, 👩🏼 🤝 👩🏻
Używaj 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 obiektmi 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 biblioteki 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ę (jeśli jest dostępna), klawiatura może wyszukać te klawisze w pakiecie EditorInfo.extras
:
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 generowane 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 za pomocą 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... | 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 obsługi AppCompat
Jeśli Twoja aplikacja nie używa AppCompat
, użyj w module emoji2-views-helper
pomocników integracji widoków, które zostały zaprojektowane do użytku w widokach niestandardowych. To pomocnicze klasy, których biblioteka AppCompat
używa do implementowania obsługi emotikonów.
Aby obsługiwać widoki niestandardowe w przypadku aplikacji, które nie korzystają z usług 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ą wyświetlane prawidłowo.
- 14.0: 🫠, 🫱🏼🫲🏿, 🫰🏽
- 13.1: 😶🌫️, 🧔🏻♀️, 🧑🏿❤️🧑🏾
- 13.0: 🥲, 🥷🏿, 🐻 ☕️
- 12.1: 🧑🏻🦰, 🧑🏿🦯, 👩🏻🤝👩🏼
- 12.0: 🦩, 🦻🏿, 👩🏼🤝👩🏻
Opcjonalne funkcje obsługi emoji2
Po dodaniu biblioteki emoji2
do aplikacji możesz dodać funkcje opisane w tej sekcji.
Konfigurowanie emoji2 do używania innej czcionki lub dostawcy czcionek do pobrania
Aby skonfigurować emoji2
do korzystania z innego lub innego 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ę, aby wczytywać czcionki z innego źródła za pomocą
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 czcionek. 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 klasy podstawowej:
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 ustawiona jest wartośćtrue
,EmojiCompat
zastępuje 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ć na zainicjowanie EmojiCompat
przed przetworzeniem emotikonu 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 inicjowania, wywołaj metodę getLoadState()
. Ta metoda zwraca jedną z tych wartości:
LOAD_STATE_LOADING
,
LOAD_STATE_SUCCEEDED
lub
LOAD_STATE_FAILED
.
Obsługa pakietów czcionek za pomocą emotikon2
Możesz użyć artefaktu emoji2-bundled
, aby dołączyć do aplikacji czcionkę emotikonów. Ponieważ czcionka NotoColorEmoji
ma rozmiar ponad 10 MB, zdecydowanie zalecamy, aby w miarę możliwości używać w aplikacji czcionek do pobrania. Artefakt emoji2-bundled
jest przeznaczony dla aplikacji na urządzenia, które nie obsługują czcionek dostępnych do pobrania.
Aby użyć artefaktu emoji2-bundled
:
Uwzględnij artefakty
emoji2-bundled
iemoji2
:implementation "androidx.emoji2:emoji2:$emojiVersion" implementation "androidx.emoji2:emoji2-bundled:$emojiVersion"
Skonfiguruj
emoji2
tak, aby korzystała z połączonej konfiguracji: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ą z użyciem biblioteki startowej EmojiCompatInitializer
i DefaultEmojiCompatConfig
.
Gdy pierwsze działanie zostanie wznowione w aplikacji, inicjator zaplanuje wczytywanie czcionek emotikonów. To krótkie opóźnienie pozwala aplikacji wyświetlić początkową treść bez potencjalnego opóźnienia spowodowanego 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 wątkowi w tle około 150 ms.
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.