Support library EmojiCompat
bertujuan untuk
menjaga perangkat Android tetap terupdate dengan emoji terbaru. Library tersebut mencegah aplikasi
Anda menampilkan karakter emoji yang hilang dalam bentuk ☐, yang
menunjukkan bahwa perangkat Anda tidak memiliki font untuk menampilkan teks tersebut. Dengan
menggunakan support library EmojiCompat
,
pengguna aplikasi Anda tidak perlu menunggu update Android OS untuk mendapatkan emoji
terbaru.
Lihat referensi terkait berikut ini:
Bagaimana cara kerja EmojiCompat?
Support library EmojiCompat
menyediakan
class untuk mengimplementasikan dukungan emoji kompatibilitas mundur di perangkat yang menjalankan
Android 4.4 (API level 19) dan yang lebih baru. Anda dapat mengonfigurasi
EmojiCompat
dengan font bawaan atau
yang dapat didownload. Untuk informasi selengkapnya tentang konfigurasi, lihat
bagian berikut:
EmojiCompat
mengidentifikasi emoji untuk CharSequence
tertentu,
menggantinya dengan
EmojiSpans
, jika diperlukan, dan
merender glyph emoji. Gambar 2 menunjukkan prosesnya.
Konfigurasi font yang dapat didownload
Konfigurasi font yang dapat didownload menggunakan fitur support library
Downloadable Fonts untuk mendownload font emoji. Fitur tersebut juga mengupdate metadata emoji
yang harus terus dijaga oleh support library
EmojiCompat
agar sesuai dengan versi terbaru spesifikasi
Unicode-nya.
Menambahkan dependensi support library
Untuk menggunakan support library EmojiCompat
,
Anda perlu mengubah dependensi classpath project aplikasi dalam
lingkungan pengembangan Anda.
Untuk menambahkan support library ke project aplikasi Anda:
- Buka file
build.gradle
aplikasi Anda. - Tambahkan support library ke bagian
dependencies
.
Groovy
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Melakukan inisialisasi konfigurasi font yang dapat didownload
Anda perlu menginisialisasi EmojiCompat
untuk
memuat metadata dan typeface. Karena proses inisialisasi memerlukan waktu,
proses ini berjalan pada thread latar belakang.
Untuk menginisialisasi EmojiCompat
dengan
konfigurasi font yang dapat didownload, lakukan langkah-langkah berikut:
- Buat instance class
FontRequest
dan sediakan otoritas penyedia font, paket penyedia font, kueri font, dan daftar kumpulan hash untuk sertifikat. Untuk informasi selengkapnya tentangFontRequest
, lihat bagian Menggunakan Downloadable Fonts secara terprogram di dokumentasi Downloadable Fonts. - Buat instance
FontRequestEmojiCompatConfig
dan berikan instanceContext
danFontRequest
. - Inisialisasi
EmojiCompat
dengan memanggil metodeinit()
dan teruskan instanceFontRequestEmojiCompatConfig
. - Gunakan widget
EmojiCompat
dalam XML tata letak. Jika Anda menggunakanAppCompat
, lihat bagian Menggunakan widget EmojiCompat dengan 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"/>
Untuk informasi selengkapnya tentang cara mengonfigurasi
EmojiCompat
dengan konfigurasi font yang dapat didownload,
buka aplikasi contoh Kompatibilitas Emoji
Java
| Kotlin.
Komponen library
- Widget:
EmojiEditText
,EmojiTextView
,EmojiButton
- Implementasi widget default untuk menggunakan
EmojiCompat
denganTextView
,EditText
, danButton
. EmojiCompat
- Platform publik utama untuk support library. Melakukan semua panggilan eksternal dan berkoordinasi dengan bagian sistem lain.
EmojiCompat.Config
- Mengonfigurasi instance singleton agar dibuat.
EmojiSpan
- Subclass
ReplacementSpan
yang menggantikan karakter (urutan) dan merender glyph. - Font
EmojiCompat
EmojiCompat
menggunakan font untuk menampilkan emoji. Font ini adalah versi modifikasi dari font Android Emoji. Font diubah seperti berikut:- Untuk memberikan kompatibilitas mundur guna merender emoji, semua karakter emoji diwakili dengan satu poin kode Unicode dalam Supplemental Private Use Area-A Unicode yang dimulai dari U+F0001.
-
Metadata emoji tambahan dimasukkan dalam format biner ke dalam font dan
diuraikan pada saat runtime oleh
EmojiCompat
. Data tersebut disematkan dalam tabelmeta
font, dengan tag pribadi Emji.
Opsi konfigurasi
Anda dapat menggunakan instance EmojiCompat
untuk
mengubah perilaku EmojiCompat
. Anda dapat menggunakan
metode berikut dari class dasar untuk menetapkan konfigurasi:
setReplaceAll()
: Menentukan apakahEmojiCompat
harus mengganti semua emoji yang ditemukannya denganEmojiSpans
. Secara default,EmojiCompat
melakukan yang terbaik untuk memahami apakah sistem dapat merender emoji dan tidak menggantikan emoji tersebut. Jika ditetapkan ketrue
,EmojiCompat
akan menggantikan semua emoji yang ditemukannya denganEmojiSpans
.setEmojiSpanIndicatorEnabled()
: Menunjukkan apakahEmojiCompat
telah mengganti emoji denganEmojiSpan
. Jika ditetapkan ketrue
,EmojiCompat
akan menggambar latar belakang untukEmojiSpan
. Metode ini hanya digunakan untuk tujuan proses debug.setEmojiSpanIndicatorColor()
: Menetapkan warna untuk menunjukkanEmojiSpan
. Nilai defaultnya adalahGREEN
.registerInitCallback
: Memberi tahu aplikasi tentang status inisialisasiEmojiCompat
.
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() {...})
Menambahkan pemroses inisialisasi
Class EmojiCompat
dan
EmojiCompat
menyediakan
registerInitCallback()
dan
unregisterInitCallback()
untuk mendaftarkan callback inisialisasi. Untuk menggunakan metode ini, buat
instance dari class
EmojiCompat.InitCallback
. Panggil
metode ini dan teruskan instance class
EmojiCompat.InitCallback
. Jika
inisialisasi support library
EmojiCompat
berhasil, class
EmojiCompat
akan memanggil
metode
onInitialized()
. Jika library gagal
menginisialisasi, class EmojiCompat
akan memanggil
metode
onFailed()
.
Untuk memeriksa status inisialisasi pada semua titik, panggil
metode
getLoadState()
. Metode akan menampilkan salah satu nilai berikut:
LOAD_STATE_LOADING
,
LOAD_STATE_SUCCEEDED
,
atau LOAD_STATE_FAILED
.
Menggunakan EmojiCompat dengan widget AppCompat
Jika menggunakan AppCompat widgets
, Anda
dapat menggunakan widget EmojiCompat
yang diperluas
dari AppCompat widgets
.
- Tambahkan support library ke bagian dependensi.
Groovy
dependencies { ... implementation "androidx.emoji:emoji-bundled:$version" }
Kotlin
dependencies { implementation("androidx.emoji:emoji-appcompat:$version") }
Groovy
dependencies { implementation "androidx.emoji:emoji-appcompat:$version" }
- Gunakan widget
EmojiCompat
AppCompat Widget
dalam XML tata letak.
<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"/>
Konfigurasi font bawaan
Support library EmojiCompat
juga
tersedia dalam versi font bawaan. Paket ini menyertakan font dengan
metadata yang telah disematkan. Paket ini juga menyertakan
BundledEmojiCompatConfig
yang menggunakan AssetManager
untuk memuat metadata
dan font.
Catatan: Font berukuran beberapa megabyte.
Menambahkan dependensi support library
Untuk menggunakan support library EmojiCompat
dengan konfigurasi font bawaan, Anda harus mengubah dependensi classpath project aplikasi
dalam lingkungan pengembangan Anda.
Untuk menambahkan support library ke project aplikasi Anda:
- Buka file
build.gradle
aplikasi Anda. - Tambahkan support library ke bagian
dependencies
.
Groovy
dependencies { ... implementation "androidx.emoji:emoji:28.0.0" }
Kotlin
dependencies { ... implementation("androidx.emoji:emoji:28.0.0") }
Menggunakan font bawaan untuk mengonfigurasi EmojiCompat
Untuk menggunakan font bawaan guna mengonfigurasi
EmojiCompat
, lakukan langkah-langkah berikut:
- Gunakan
BundledEmojiCompatConfig
untuk membuat instance dariEmojiCompat
dan memberikan instanceContext
. - Panggil metode
init()
untuk menginisialisasiEmojiCompat
dan meneruskan instanceBundledEmojiCompatConfig
.
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); ... } }
Menggunakan EmojiCompat tanpa widget
EmojiCompat
menggunakan
EmojiSpan
untuk merender gambar yang benar.
Oleh karena itu, metode tersebut harus mengubah CharSequence
apa pun menjadi
instance Spanned
dengan
EmojiSpans
. Class
EmojiCompat
menyediakan metode untuk
mengubah CharSequences
menjadi
instance Spanned
dengan
EmojiSpans
. Dengan menggunakan metode ini,
Anda dapat memproses dan meng-cache instance yang diproses, bukan string mentahnya,
sehingga dapat meningkatkan performa aplikasi Anda.
Kotlin
val processed = EmojiCompat.get().process("neutral face \uD83D\uDE10")
Java
CharSequence processed = EmojiCompat.get().process("neutral face \uD83D\uDE10");
Menggunakan EmojiCompat untuk IME
Dengan menggunakan support library EmojiCompat
,
keyboard dapat merender emoji yang didukung oleh aplikasi yang
berinteraksi dengannya. IME dapat menggunakan metode
hasEmojiGlyph()
untuk memeriksa apakah EmojiCompat
dapat
merender emoji. Metode ini membutuhkan CharSequence
dari
emoji dan menampilkan true
jika
EmojiCompat
dapat mendeteksi dan merender
emoji.
Keyboard juga dapat memeriksa versi support library
EmojiCompat
yang didukung aplikasi
untuk menentukan emoji yang akan dirender pada palet. Untuk memeriksa
versi, jika tersedia, keyboard harus memeriksa apakah kunci berikut
ada di
paket
EditorInfo.extras
:
EDITOR_INFO_METAVERSION_KEY
EDITOR_INFO_REPLACE_ALL_KEY
Jika kunci ada dalam paket, nilai tersebut mewakili versi
metadata emoji yang digunakan aplikasi. Jika kunci ini tidak ada,
aplikasi tidak menggunakan EmojiCompat
.
Jika kunci tersebut ada dan ditetapkan ke true
, hal ini menunjukkan bahwa
aplikasi telah memanggil
metode
SetReplaceAll()
. Untuk informasi selengkapnya tentang
konfigurasi EmojiCompat
,
lihat bagian Opsi konfigurasi
.
Setelah menerima kunci di
paket EditorInfo.extras
,
keyboard dapat menggunakan
metode hasEmojiGlyph()
di mana metadataVersion
adalah nilai untuk
EDITOR_INFO_METAVERSION_KEY
,
untuk memeriksa apakah aplikasi dapat merender emoji tertentu.
Menggunakan EmojiCompat dengan widget kustom
Anda selalu dapat menggunakan metode process()
untuk melakukan memproses CharSequence
lebih dulu di aplikasi Anda dan menambahkannya
ke widget mana pun yang dapat merender instance Spanned
;
misalnya, TextView
. Selain itu,
EmojiCompat
menyediakan class helper widget
berikut agar Anda dapat memperkaya widget kustom dengan
dukungan emoji tanpa susah payah.
- Contoh TextView
- Contoh 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() { ... } }
Pertanyaan umum (FAQ)
- Bagaimana cara memulai download font?
- Berapa lama waktu yang diperlukan untuk melakukan inisialisasi?
- Berapa banyak memori yang digunakan oleh support library EmojiCompat?
- Dapatkah saya menggunakan EmojiCompat untuk TextView kustom?
- Apa yang terjadi jika saya menambahkan widget dalam XML tata letak pada perangkat yang berjalan di Android 4.4 (API level 19) atau yang lebih lama?
Font emoji didownload pada permintaan pertama, jika font tersebut tidak ada di perangkat. Penjadwalan download bersifat transparan untuk aplikasi.
Setelah font didownload, diperlukan sekitar 150 milidetik
untuk menginisialisasi EmojiCompat
.
Saat ini, struktur data untuk menemukan emoji dimuat di memori aplikasi dan menggunakan sekitar 200 KB.
Ya. EmojiCompat menyediakan class helper untuk widget kustom. Anda juga dapat
memproses string tertentu lebih dulu dan mengubahnya menjadi
Spanned
. Untuk informasi selengkapnya tentang class helper
widget, lihat bagian
Menggunakan EmojiCompat dengan widget kustom.
Anda dapat menyertakan support library EmojiCompat
atau widget-nya di aplikasi yang mendukung perangkat yang
menjalankan Android 4.4 (API level 19) atau yang lebih lama. Namun, jika perangkat berjalan
pada versi Android sebelum API level 19,
EmojiCompat
dan widget-nya berada dalam status
"tidak beroperasi". Ini berarti bahwa
EmojiTextView
berperilaku sama
seperti TextView
biasa.
Instance EmojiCompat
; status
LOAD_STATE_SUCCEEDED
akan langsung dicapai
saat Anda memanggil
metode
init()
.
Referensi lainnya
Untuk informasi tambahan tentang penggunaan
library EmojiCompat
,
tonton EmojiCompat.