Biblioteka obsługi EmojiCompat
ma na celu aktualizowanie urządzeń z Androidem do najnowszych wersji emoji. Zapobiega to wyświetlaniu brakujących emotikonów w postaci znaku ☐, co oznacza, że urządzenie nie ma czcionki do wyświetlania tekstu. Dzięki bibliotece pomocy EmojiCompat
użytkownicy aplikacji nie muszą czekać na aktualizacje systemu operacyjnego Android, aby uzyskać dostęp do najnowszych emotikonów.
Zapoznaj się z tymi materiałami:
Jak działa emojiCompat?
Biblioteka pomocnicza EmojiCompat
udostępnia klasy do implementacji obsługi emoji z obsługą wsteczną na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) i nowszych. Możesz skonfigurować
EmojiCompat
za pomocą czcionek w pakiecie lub
pobieranych czcionek. Więcej informacji o konfiguracji znajdziesz w tych sekcjach:
EmojiCompat
identyfikuje emotikony dla danego elementu
CharSequence
, w razie potrzeby zastępuje je elementem
EmojiSpans
, a na koniec renderuje glif emotikonu. Proces ten przedstawia rysunek 2.
Konfiguracja czcionek do pobrania
Konfiguracja czcionek do pobrania korzysta z biblioteki czcionek do pobrania, aby pobrać czcionkę emotikonów. Aktualizuje też niezbędne metadane emotikonów, których biblioteka obsługi EmojiCompat
potrzebuje do obsługi najnowszych wersji specyfikacji Unicode.
Dodawanie zależności biblioteki pomocy
Aby korzystać z biblioteki pomocniczej EmojiCompat
, musisz zmodyfikować zależności ścieżki klasy projektu aplikacji w środowisku programistycznym.
Aby dodać bibliotekę pomocniczą do projektu aplikacji:
- Otwórz plik
build.gradle
swojej aplikacji. - Dodaj bibliotekę pomocy do sekcji
dependencies
.
Groovy
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Inicjowanie konfiguracji czcionki do pobrania
Aby załadować metadane i czcionkę, musisz zainicjować EmojiCompat
. Ponieważ inicjowanie może zająć trochę czasu, proces inicjowania jest uruchamiany w wątku w tle.
Aby zainicjować EmojiCompat
z konfiguracją czcionki do pobrania, wykonaj te czynności:
- Utwórz instancję klasy
FontRequest
i podaj urząd dostawcy czcionek, jego pakiet, zapytanie dotyczące czcionki oraz listę zestawów haszy dla certyfikatu. Więcej informacji oFontRequest
znajdziesz w sekcji Używanie czcionek do pobrania w programie w dokumentacji Czcionki do pobrania. - Utwórz instancję
FontRequestEmojiCompatConfig
i podaj instancjeContext
orazFontRequest
. - Zainicjuj
EmojiCompat
, wywołując metodęinit()
i przekazując instancjęFontRequestEmojiCompatConfig
. - Używaj widżetów
EmojiCompat
w plikach XML układu. Jeśli używaszAppCompat
, zapoznaj się z sekcją Używanie widżetów EmojiCompat z AppCompat.
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"/>
Więcej informacji o konfigurowaniu EmojiCompat
z możliwością pobrania konfiguracji czcionek znajdziesz w próbnej aplikacji Emoji Compatibility w językach: Java
| Kotlin.
Komponenty biblioteki
- Widżety:
EmojiEditText
,EmojiTextView
,EmojiButton
- Domyślne implementacje widżetów do użycia
EmojiCompat
zTextView
,EditText
iButton
. EmojiCompat
- Główna publiczna strona biblioteki pomocy. Wykonuje wszystkie zewnętrzne wywołania i współdziała z innymi częściami systemu.
EmojiCompat.Config
- Konfiguruje tworzoną instancję typu singleton.
EmojiSpan
- Podklasa
ReplacementSpan
, która zastępuje znak (sekwencje) i renderuje glif. - Czcionka:
EmojiCompat
EmojiCompat
używa czcionki do wyświetlania emotikonów. Ta czcionka jest zmodyfikowaną wersją czcionki emotikonów na Androida. Czcionka jest modyfikowana w ten sposób:- Aby zapewnić zgodność wsteczną podczas renderowania emotikonów, wszystkie emotikony są reprezentowane przez pojedynczy punkt kodu Unicode w obszarze uzupełniającym do użytku prywatnego Unicode A, zaczynając od U+F0001.
-
Dodatkowe metadane emotikonów są wstawiane w formacie binarnym do czcionki i przetwarzane w czasie wykonywania przez
EmojiCompat
. Dane są umieszczone w tabelimeta
czcionki razem z prywatnym tagiem Emji.
Opcje konfiguracji
Możesz użyć instancji EmojiCompat
, aby zmodyfikować zachowanie EmojiCompat
. Aby skonfigurować konfigurację, możesz użyć tych metod z klasy bazowej:
setReplaceAll()
: określa, czyEmojiCompat
ma zastąpić wszystkie znalezione emotikony kodemEmojiSpans
. DomyślnieEmojiCompat
stara się jak najlepiej zrozumieć, czy system może wyświetlić emotikon, i nie zastępuje go innymi emotikonami. Gdy jest ustawiony natrue
,EmojiCompat
zastępuje wszystkie znalezione emotikony emotikonemEmojiSpans
.setEmojiSpanIndicatorEnabled()
: wskazuje, czyEmojiCompat
zastąpił emotikon emotikonemEmojiSpan
. Jeśli ustawisz wartośćtrue
,EmojiCompat
będzie rysować tło dla obszaru roboczegoEmojiSpan
. Ta metoda jest używana głównie do debugowania.setEmojiSpanIndicatorColor()
: określa kolor, który wskazujeEmojiSpan
. Wartością domyślną jestGREEN
.registerInitCallback
: Informuje aplikację o stanie inicjalizacjiEmojiCompat
.
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() {...})
Dodawanie odbiorców zdarzeń inicjowania
Klasy EmojiCompat
i EmojiCompat
udostępniają metody registerInitCallback()
i unregisterInitCallback()
do rejestrowania wywołania zwrotnego inicjalizacji. Aby użyć tych metod, utwórz instancję klasy EmojiCompat.InitCallback
. Wywołuj te metody i przekaż instancję klasy EmojiCompat.InitCallback
. Gdy biblioteka obsługi EmojiCompat
zostanie zainicjowana, 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()
. Zwraca jedną z tych wartości:
LOAD_STATE_LOADING
,
LOAD_STATE_SUCCEEDED
lub LOAD_STATE_FAILED
.
Korzystanie z EmojiCompat w widżetach AppCompat
Jeśli używasz AppCompat widgets
, możesz używać widżetów EmojiCompat
, które rozszerzają funkcjonalność AppCompat widgets
.
- Dodaj bibliotekę wsparcia do sekcji zależności.
Groovy
dependencies { ... implementation "androidx.emoji:emoji-bundled:$version" }
Kotlin
dependencies { implementation("androidx.emoji:emoji-appcompat:$version") }
Odlotowe
dependencies { implementation "androidx.emoji:emoji-appcompat:$version" }
- Używaj widżetów
EmojiCompat
AppCompat Widget
w plikach XML układu.
<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"/>
Konfiguracja czcionek w pakiecie
Biblioteka pomocy EmojiCompat
jest też dostępna w pakiecie z czcionkami. Ten pakiet zawiera czcionkę z wbudowanymi metadanymi. Pakiet zawiera też zasób BundledEmojiCompatConfig
, który do wczytywania metadanych i czcionek używa AssetManager
.
Uwaga: rozmiar czcionki jest podany w megabajtach.
Dodawanie zależności biblioteki pomocy
Aby używać biblioteki obsługi EmojiCompat
z konfigurowaną czcionką w pakiecie, musisz zmodyfikować zależności classpath projektu aplikacji w środowisku programistycznym.
Aby dodać bibliotekę pomocy do projektu aplikacji:
- Otwórz plik
build.gradle
swojej aplikacji. - Dodaj bibliotekę pomocy do sekcji
dependencies
.
Groovy
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Konfigurowanie EmojiCompat za pomocą czcionek w pakiecie
Aby do skonfigurowania EmojiCompat
używać czcionek w pakiecie, wykonaj te czynności:
- Użyj
BundledEmojiCompatConfig
do utworzenia instancjiEmojiCompat
i podania instancjiContext
. - Wywołaj metodę
init()
, aby zainicjować klasęEmojiCompat
i przekazać instancję klasyBundledEmojiCompatConfig
.
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); ... } }
Korzystanie z EmojiCompat bez widżetów
EmojiCompat
używa EmojiSpan
do renderowania prawidłowych obrazów.
Dlatego musi przekształcić dowolną wartość CharSequence
w instancje Spanned
z wartością EmojiSpans
. Klasa EmojiCompat
udostępnia metodę do konwertowania obiektów CharSequences
na instancje Spanned
za pomocą metody EmojiSpans
. Dzięki tej metodzie możesz przetwarzać i przechowywać w pamięci podręcznej przetworzone instancje zamiast surowego ciągu znaków, co zwiększa 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 do klawiatur
Korzystając z biblioteki obsługi EmojiCompat
, klawiatury mogą renderować emotikony obsługiwane przez aplikację, z którą użytkownik wchodzi w interakcję. Interfejsy IME mogą używać metody hasEmojiGlyph()
, aby sprawdzić, czy EmojiCompat
jest w stanie wyświetlić emotikon. Ta metoda przyjmuje CharSequence
emotikona i zwraca true
, jeśli EmojiCompat
może wykryć i wyrenderować emotikon.
Klawiatura może też sprawdzić wersję biblioteki obsługi EmojiCompat
, którą obsługuje aplikacja, aby określić, które emoji ma renderować w palecie. Aby sprawdzić wersję, jeśli jest dostępna, klawiatura musi sprawdzić, czy w pakiecie EditorInfo.extras
znajdują się te klawisze:
EDITOR_INFO_METAVERSION_KEY
EDITOR_INFO_REPLACE_ALL_KEY
Jeśli klucz znajduje się w pakiecie, wartość reprezentuje wersję metadanych emotikonu używaną przez aplikację. Jeśli ten klucz nie istnieje, aplikacja nie używa EmojiCompat
.
Jeśli klucz istnieje i ma wartość true
, oznacza to, że aplikacja wywołała metodę SetReplaceAll()
. Więcej informacji o konfiguracji EmojiCompat
znajdziesz w sekcji Opcje konfiguracji.
Po otrzymaniu kluczy w pakiecie EditorInfo.extras
klawiatura może użyć metody hasEmojiGlyph()
, gdzie metadataVersion
to wartość parametru EDITOR_INFO_METAVERSION_KEY
, aby sprawdzić, czy aplikacja może wyświetlić określony emotikon.
Korzystanie z EmojiCompat w widżetach niestandardowych
Zawsze możesz użyć metody process()
, aby wstępnie przetworzyć CharSequence
w aplikacji i dodać ją do dowolnego widżetu, który może renderować instancje Spanned
, np. TextView
. Dodatkowo EmojiCompat
udostępnia poniższe klasy pomocnicze widżetów, aby przy minimalnym nakładzie pracy wzbogacić niestandardowe widżety o obsługę emotikonów.
- Przykładowy TextView
- Przykładowy element 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() { ... } }
Najczęstsze pytania
- Jak rozpocząć pobieranie czcionek?
- Ile trwa inicjowanie?
- Ile pamięci zajmuje biblioteka obsługi EmojiCompat?
- Czy mogę używać emojiCompat jako niestandardowego obiektu TextView?
- Co się stanie, jeśli dodam widżety w pliku XML układu na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub starszym?
Czcionki emoji są pobierane przy pierwszym żądaniu, jeśli nie są dostępne na urządzeniu. Harmonogram pobierania jest przezroczysty dla aplikacji.
Po pobraniu czcionki inicjowanie EmojiCompat
zajmuje około 150 ms.
Obecnie struktura danych służąca do znajdowania emotikonów jest wczytana do pamięci aplikacji i zajmuje około 200 KB.
Tak. EmojiCompat udostępnia pomocnicze klasy dla niestandardowych widżetów. Możesz też wstępnie przetworzyć dany ciąg i przekonwertować go na Spanned
. Więcej informacji o klasach pomocniczych widgetów znajdziesz w sekcji Korzystanie z EmojiCompat w przypadku niestandardowych widgetów.
Możesz dodać bibliotekę obsługi EmojiCompat
lub jej widżety do aplikacji, które obsługują urządzenia z Androidem 4.4 (poziom interfejsu API 19) lub starszym. Jeśli jednak urządzenie korzysta z Androida w wersji starszej niż 19, interfejs EmojiCompat
i jego widżety są w stanie „Brak działania”. Oznacza to, że
EmojiTextView
działa dokładnie tak samo jak zwykły TextView
.
instancja EmojiCompat
, która natychmiast przechodzi w stan LOAD_STATE_SUCCEEDED
, gdy wywołasz metodę init()
;
Dodatkowe materiały
Aby dowiedzieć się więcej o korzystaniu z biblioteki EmojiCompat
, obejrzyj film EmojiCompat.