Biblioteka pomocy EmojiCompat
ma na celu zapewnienie aktualności na urządzeniach z Androidem najnowszych emotikonów. Zapobiega wyświetlaniu w aplikacji brakujących znaków emotikonów w postaci ☐, co oznacza, że na urządzeniu nie ma czcionki do wyświetlenia tekstu. Dzięki bibliotece pomocy EmojiCompat
użytkownicy Twojej aplikacji nie muszą czekać na aktualizacje systemu operacyjnego Android, aby otrzymać najnowsze emotikony.
Zapoznaj się z tymi powiązanymi materiałami:
Jak działa emojiCompat?
Biblioteka pomocy EmojiCompat
zawiera klasy umożliwiające wdrożenie zgodnych wstecznie obsługi emotikonów na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub nowszym. Możesz skonfigurować EmojiCompat
, używając czcionek dostępnych w pakiecie lub tych do pobrania. Więcej informacji o konfiguracji znajdziesz w tych sekcjach:
EmojiCompat
identyfikuje emotikon w danym elemencie CharSequence
, w razie potrzeby zastępuje go EmojiSpans
i na koniec renderuje glify emotikonów. Rys. 2 przedstawia cały proces.
Konfiguracja czcionek do pobrania
Konfiguracja czcionek do pobrania korzysta z biblioteki obsługi czcionek do pobrania, aby pobrać czcionkę z emotikonami. Zaktualizuje także niezbędne metadane emotikonów, które biblioteka obsługi EmojiCompat
musi być zgodna z najnowszymi wersjami specyfikacji Unicode.
Dodawanie zależności biblioteki pomocy
Aby korzystać z biblioteki pomocy EmojiCompat
, musisz zmodyfikować zależności ścieżki klasy 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
.
Odlotowe
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Inicjuję konfigurację czcionki do pobrania
Aby wczytać metadane i krój czcionki, musisz zainicjować EmojiCompat
. Ponieważ inicjowanie może trochę potrwać, proces inicjowania jest wykonywany w wątku w tle.
Aby zainicjować EmojiCompat
przy użyciu pobieranej konfiguracji czcionki, 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 na tematFontRequest
znajdziesz w sekcji Programowe używanie czcionek z możliwością pobierania w dokumentacji Czcionek do pobrania. - Utwórz instancję
FontRequestEmojiCompatConfig
i udostępnij 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żywasz interfejsuAppCompat
, zapoznaj się z sekcją Używanie widżetów emojiCompat w aplikacji 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 tym, jak skonfigurować
EmojiCompat
przy użyciu konfiguracji czcionki do pobrania, znajdziesz w przykładowej aplikacji zgodności emotikonów
Java
| Kotlin.
Komponenty biblioteki
- Widżety:
EmojiEditText
,EmojiTextView
,EmojiButton
- Domyślne implementacje widżetów, które używają
EmojiCompat
z parametramiTextView
,EditText
iButton
. EmojiCompat
- Główna platforma publiczna biblioteki pomocy. Wykonuje wszystkie połączenia zewnętrzne i współrzędne z innymi częściami systemu.
EmojiCompat.Config
- Konfiguruje instancję usługi typu singleton do utworzenia.
EmojiSpan
- Podklasa
ReplacementSpan
, która zastępuje znak (sekwencje) i renderuje glif. - Czcionka:
EmojiCompat
EmojiCompat
używa czcionki do wyświetlania emotikonów. To zmodyfikowana wersja czcionki emotikonów na Androidzie. Czcionka jest modyfikowana w ten sposób:- Aby zapewnić wsteczną kompatybilność z renderowaniem emotikonów, wszystkie znaki emotikonów są reprezentowane za pomocą jednego punktu kodowego Unicode w dodatkowym obszarze A do prywatnego użytku Unicode, zaczynając od U+F0001.
-
Dodatkowe metadane emotikonów są wstawiane do czcionki w formacie binarnym i są analizowane przez usługę
EmojiCompat
w czasie działania. Dane są umieszczone w tabelimeta
czcionki razem z prywatnym tagiem Emji.
Opcje konfiguracji
Za pomocą instancji EmojiCompat
możesz zmienić działanie usługi EmojiCompat
. Aby ustawić konfigurację, możesz użyć tych metod z klasy podstawowej:
setReplaceAll()
: określa, czyEmojiCompat
ma zastąpić wszystkie znalezione emotikony kodemEmojiSpans
. DomyślnieEmojiCompat
stara się określić, czy system może renderować emotikon i nie zastępuje tych emotikonów. Gdy ustawisz wartośćtrue
,EmojiCompat
zastępuje wszystkie znalezione emotikony wartościąEmojiSpans
.setEmojiSpanIndicatorEnabled()
: wskazuje, czy emotikonEmojiCompat
zastąpił emotikonEmojiSpan
. Jeśli ustawisz wartośćtrue
,EmojiCompat
będzie rysować tło dla obszaru roboczegoEmojiSpan
. Ta metoda jest używana głównie do debugowania.setEmojiSpanIndicatorColor()
: ustawia kolorEmojiSpan
. Wartością domyślną jestGREEN
.registerInitCallback
: informuje aplikację o stanie inicjowaniaEmojiCompat
.
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 detektorów inicjowania
Klasy EmojiCompat
i EmojiCompat
udostępniają metody registerInitCallback()
i unregisterInitCallback()
do rejestrowania wywołania zwrotnego inicjowania. Aby użyć tych metod, utwórz instancję klasy EmojiCompat.InitCallback
. Wywołaj 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łuje metodę onFailed()
.
Aby sprawdzić stan inicjowania w dowolnym momencie, wywołaj metodę getLoadState()
. Zwraca jedną z tych wartości: LOAD_STATE_LOADING
, LOAD_STATE_SUCCEEDED
lub LOAD_STATE_FAILED
.
Używanie emojiCompat z widżetami AppCompat
Jeśli używasz AppCompat widgets
, możesz używać widżetów EmojiCompat
, które rozpoczynają się od AppCompat widgets
.
- Dodaj bibliotekę pomocy do sekcji zależności.
Odlotowe
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
EmojiCompat
widżetówAppCompat 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. Pakiet zawiera czcionkę z osadzonymi metadanymi. Pakiet zawiera też zasób BundledEmojiCompatConfig
, który do wczytywania metadanych i czcionek używa AssetManager
.
Uwaga: rozmiar czcionki jest podany w wielu megabajtach.
Dodawanie zależności biblioteki pomocy
Aby korzystać z biblioteki pomocy EmojiCompat
z powiązaną konfiguracją czcionek, musisz zmodyfikować zależności ścieżki klasy w projekcie aplikacji w środowisku programistycznym.
Aby dodać bibliotekę pomocy do projektu aplikacji:
- Otwórz plik
build.gradle
swojej aplikacji. - Dodaj bibliotekę pomocy do sekcji
dependencies
.
Odlotowe
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Korzystanie z pakietów czcionek w celu skonfigurowania emotikonaCompat
Aby do skonfigurowania EmojiCompat
używać czcionek w pakiecie, wykonaj te czynności:
- Użyj
BundledEmojiCompatConfig
, aby utworzyć instancjęEmojiCompat
i podać instancjęContext
. - Wywołaj metodę
init()
, aby zainicjowaćEmojiCompat
i przekazać instancjęBundledEmojiCompatConfig
.
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 Emotikonów bez widżetów
EmojiCompat
używa EmojiSpan
do renderowania prawidłowych obrazów.
Dlatego musi przekonwertować każdą instancję CharSequence
na instancję Spanned
za pomocą funkcji EmojiSpans
. Klasa EmojiCompat
udostępnia metodę konwersji CharSequences
na instancje Spanned
za pomocą EmojiSpans
. Za pomocą tej metody możesz przetwarzać przetworzone instancje i zapisywać je w pamięci podręcznej zamiast nieprzetworzonego 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");
Korzystanie z Emotikonów w edytorze IME
Korzystając z biblioteki pomocy EmojiCompat
, klawiatury mogą renderować emotikony obsługiwane przez aplikację, z którą wchodzą w interakcję. Edytory IME mogą używać metody hasEmojiGlyph()
, by sprawdzić, czy EmojiCompat
może renderować emotikon. Ta metoda pobiera CharSequence
emotikona i zwraca true
, jeśli EmojiCompat
może go wykryć i wyświetlić.
Aby określić, który emotikon wyświetlić w palecie, klawiatura może też sprawdzić wersję biblioteki obsługi EmojiCompat
obsługiwaną przez aplikację. Aby sprawdzić wersję (jeśli jest dostępna), klawiatura musi sprawdzić, czy w pakiecie EditorInfo.extras
są 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 korzysta z 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 z pakietu EditorInfo.extras
klawiatura może użyć metody hasEmojiGlyph()
, gdzie metadataVersion
to wartość EDITOR_INFO_METAVERSION_KEY
, aby sprawdzić, czy aplikacja może renderować konkretny emotikon.
Korzystanie z emojiCompat z niestandardowymi widżetami
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 tekst 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 czasu zajmuje inicjowanie?
- Ile pamięci używa biblioteka emotikonów obsługiwana?
- Czy mogę używać emojiCompat jako niestandardowego obiektu TextView?
- Co się stanie, jeśli dodam widżety w plikach XML układu na urządzeniach z Androidem 4.4 (poziom interfejsu API 19) lub starszym?
Czcionki emotikonów są pobierane przy pierwszym żądaniu, jeśli nie istnieją na urządzeniu. Harmonogram pobierania jest widoczny dla aplikacji.
Gdy pobierzesz czcionkę, zainicjowanie EmojiCompat
zajmie około 150 milisekund.
Struktura danych potrzebnych do znalezienia emotikona jest obecnie wczytywana w pamięci aplikacji i zajmuje około 200 KB.
Tak. emojiCompat udostępnia klasy pomocnicze do niestandardowych widżetów. Możesz też wstępnie przetworzyć dany ciąg i przekonwertować go na Spanned
. Więcej informacji o klasach pomocniczego widżetu znajdziesz w sekcji Używanie emojiCompat z widżetami niestandardowymi.
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 obiekt TextView
.
instancji EmojiCompat
; od razu po wywołaniu metody init()
przechodzi do stanu LOAD_STATE_SUCCEEDED
.
Dodatkowe materiały
Więcej informacji o korzystaniu z biblioteki EmojiCompat
znajdziesz w filmie EmojiCompat.