IME (editor metode input) adalah kontrol pengguna yang memungkinkan pengguna memasukkan teks. Android menyediakan framework metode input yang dapat diperluas sehingga memungkinkan aplikasi menyediakan metode input alternatif kepada pengguna, seperti keyboard virtual atau bahkan input ucapan. Setelah menginstal IME yang diinginkan, pengguna dapat memilih IME yang akan digunakan dari setelan sistem, lalu menggunakannya di seluruh sistem; hanya satu IME yang dapat diaktifkan pada satu waktu.
Untuk menambahkan IME ke sistem Android, buat aplikasi Android
berisi class yang memperluas InputMethodService
. Selain
itu, Anda biasanya membuat aktivitas "setelan" yang meneruskan opsi ke layanan IME. Anda
juga dapat menentukan UI setelan yang ditampilkan sebagai bagian dari setelan sistem.
Panduan ini membahas hal-hal berikut:
- Siklus proses IME
- Mendeklarasikan komponen IME dalam manifes aplikasi
- IME API
- Mendesain UI IME
- Mengirim teks dari IME ke aplikasi
- Bekerja dengan subjenis IME
Jika belum pernah bekerja dengan IME, Anda harus membaca artikel pengantar Metode Input Virtual terlebih dahulu.
Siklus proses IME
Diagram berikut menjelaskan siklus proses IME:

Gambar 1. Siklus proses IME.
Bagian berikut menjelaskan cara mengimplementasikan UI dan kode terkait IME yang mengikuti siklus proses ini.
Mendeklarasikan komponen IME dalam manifes
Di sistem Android, IME adalah aplikasi Android yang berisi layanan IME khusus.
File manifes aplikasi harus mendeklarasikan layanan, meminta izin yang diperlukan,
menyediakan filter intent yang cocok dengan tindakan action.view.InputMethod
, dan
menyediakan metadata yang mendefinisikan karakteristik IME. Selain itu, untuk menyediakan antarmuka
setelan yang memungkinkan pengguna mengubah perilaku IME, Anda dapat menentukan aktivitas
"setelan" yang dapat diluncurkan dari Setelan Sistem.
Cuplikan berikut mendeklarasikan layanan IME. Cuplikan ini meminta izin
BIND_INPUT_METHOD
untuk memungkinkan layanan menyambungkan IME
ke sistem, menyiapkan filter intent yang cocok dengan tindakan
android.view.InputMethod
, dan mendefinisikan metadata untuk IME:
<!-- Declares the input method service --> <service android:name="FastInputIME" android:label="@string/fast_input_label" android:permission="android.permission.BIND_INPUT_METHOD"> <intent-filter> <action android:name="android.view.InputMethod" /> </intent-filter> <meta-data android:name="android.view.im" android:resource="@xml/method" /> </service>
Cuplikan berikutnya mendeklarasikan aktivitas setelan untuk IME. Cuplikan ini memiliki filter intent untuk
ACTION_MAIN
yang menunjukkan bahwa aktivitas ini adalah titik entri utama
untuk aplikasi IME:
<!-- Optional: an activity for controlling the IME settings --> <activity android:name="FastInputIMESettings" android:label="@string/fast_input_settings"> <intent-filter> <action android:name="android.intent.action.MAIN"/> </intent-filter> </activity>
Anda juga dapat memberikan akses ke setelan IME langsung dari UI-nya.
API metode input
Class khusus IME ditemukan dalam paket android.inputmethodservice
dan
android.view.inputmethod
. Class KeyEvent
penting untuk menangani karakter keyboard.
Bagian tengah IME adalah komponen layanan, yakni class yang memperluas
InputMethodService
. Selain mengimplementasikan
siklus proses layanan normal, class ini juga memiliki callback untuk menyediakan UI IME, menangani input
pengguna, dan mengirimkan teks ke kolom yang saat ini memiliki fokus. Secara default,
class InputMethodService
menyediakan sebagian besar implementasi
untuk mengelola status dan visibilitas IME serta berkomunikasi dengan kolom input
saat ini.
Class berikut juga penting:
BaseInputConnection
-
Menentukan saluran komunikasi dari
InputMethod
kembali ke aplikasi yang menerima input. Anda menggunakannya untuk membaca teks di sekitar kursor, meng-commit teks ke kotak teks, dan mengirim peristiwa tombol mentah ke aplikasi. Aplikasi harus memperluas class ini, bukan mengimplementasikan antarmuka dasarInputConnection
. KeyboardView
-
Ekstensi
View
yang merender keyboard dan merespons peristiwa input pengguna. Tata letak keyboard ditetapkan oleh instanceKeyboard
yang dapat ditentukan dalam file XML.
Mendesain UI metode input
Ada dua elemen visual utama untuk IME: tampilan input dan kandidat. Anda hanya perlu mengimplementasikan elemen yang relevan dengan metode input yang sedang didesain.
Tampilan input
Tampilan input adalah UI tempat pengguna memasukkan teks dalam bentuk klik tombol, tulisan tangan, atau
gestur. Saat IME ditampilkan untuk pertama kalinya, sistem akan memanggil
callback onCreateInputView()
. Dalam
implementasi metode ini, buat tata letak yang ingin ditampilkan di jendela
IME dan kembalikan tata letak ke sistem. Cuplikan ini merupakan contoh implementasi
metode onCreateInputView()
:
Kotlin
override fun onCreateInputView(): View { return layoutInflater.inflate(R.layout.input, null).apply { if (this is MyKeyboardView) { setOnKeyboardActionListener(this@MyInputMethod) keyboard = latinKeyboard } } }
Java
@Override public View onCreateInputView() { MyKeyboardView inputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null); inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(latinKeyboard); return inputView; }
Dalam contoh ini, MyKeyboardView
adalah instance implementasi
kustom
KeyboardView
yang merender
Keyboard
.
Tampilan kandidat
Tampilan kandidat adalah UI tempat IME menampilkan kemungkinan koreksi kata atau
saran untuk dipilih pengguna. Dalam siklus proses IME, sistem akan memanggil
onCreateCandidatesView()
jika sudah siap
untuk menampilkan tampilan kandidat. Dalam implementasi metode ini, kembalikan tata letak yang
menampilkan saran kosakata, atau kembalikan null jika Anda tidak ingin menampilkan apa pun. Respons null adalah
perilaku default, sehingga Anda tidak perlu mengimplementasikannya jika tidak memberikan saran.
Pertimbangan desain UI
Bagian ini menjelaskan beberapa pertimbangan desain UI khusus IME.
Menangani beberapa ukuran layar
UI untuk IME harus dapat diskalakan ke berbagai ukuran layar, dan juga harus menangani orientasi lanskap dan potret. Dalam mode IME non-layar penuh, berikan ruang yang cukup agar aplikasi dapat menampilkan kolom teks dan setiap konteks terkait, sehingga IME tidak menempati lebih dari setengah layar. Dalam mode IME layar penuh, ini bukan masalah.
Menangani jenis input berbeda
Kolom teks Android memungkinkan Anda menetapkan jenis input spesifik, seperti teks bentuk bebas, angka, URL, alamat email, dan string penelusuran. Saat menerapkan IME baru, Anda harus mendeteksi jenis input setiap kolom dan memberikan antarmuka yang sesuai. Namun, Anda tidak perlu menyiapkan IME untuk memeriksa apakah pengguna memasukkan teks yang valid untuk jenis input; hal itu adalah tanggung jawab aplikasi yang memiliki kolom teks.
Misalnya, berikut adalah screenshot antarmuka yang disediakan IME Latin dan yang disediakan platform Android untuk input teks dan nomor telepon:


Gambar 2. Jenis input IME Latin.
Saat kolom input menerima fokus dan IME dimulai, sistem akan memanggil
onStartInputView()
,
meneruskan objek EditorInfo
yang berisi detail tentang
jenis input dan atribut lain kolom teks. Dalam objek ini,
kolom inputType
berisi jenis input kolom
teks.
Kolom inputType
adalah int
yang berisi pola bit untuk berbagai setelan jenis input. Guna mengujinya untuk jenis input
kolom teks, samarkan dengan konstanta TYPE_MASK_CLASS
, seperti
ini:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Pola bit jenis input dapat memiliki satu dari beberapa nilai, termasuk:
TYPE_CLASS_NUMBER
- Kolom teks untuk memasukkan angka. Seperti ditunjukkan dalam screenshot sebelumnya, IME Latin menampilkan tombol angka untuk kolom jenis ini.
TYPE_CLASS_DATETIME
- Kolom teks untuk memasukkan tanggal dan waktu.
TYPE_CLASS_PHONE
- Kolom teks untuk memasukkan nomor telepon.
TYPE_CLASS_TEXT
- Kolom teks untuk memasukkan semua karakter yang didukung.
Konstanta ini dijelaskan lebih mendetail dalam dokumentasi referensi untuk
InputType
.
Kolom inputType
dapat berisi bit lain yang
menunjukkan varian jenis kolom teks, seperti:
TYPE_TEXT_VARIATION_PASSWORD
-
Varian
TYPE_CLASS_TEXT
untuk memasukkan sandi. Metode input akan menampilkan dingbat, bukan teks yang sebenarnya. TYPE_TEXT_VARIATION_URI
-
Varian
TYPE_CLASS_TEXT
untuk memasukkan URL web dan Uniform Resource Identifier (URI) lainnya. TYPE_TEXT_FLAG_AUTO_COMPLETE
-
Varian
TYPE_CLASS_TEXT
untuk memasukkan teks yang "dilengkapi otomatis" oleh aplikasi dari kamus, penelusuran, atau fasilitas lainnya.
Ingat untuk menyamarkan inputType
dengan konstanta
yang sesuai saat menguji varian ini. Konstanta penyamaran yang tersedia tercantum dalam
dokumentasi referensi untuk InputType
.
Perhatian: Dalam IME Anda sendiri, pastikan untuk menangani teks dengan benar saat mengirimkannya ke kolom sandi. Sembunyikan sandi di UI, baik di tampilan input maupun di tampilan kandidat. Ingat juga bahwa Anda tidak boleh menyimpan sandi di perangkat. Untuk mempelajari lebih lanjut, lihat panduan Mendesain untuk Keamanan.
Mengirim teks ke aplikasi
Saat pengguna menginput teks dengan IME, Anda dapat mengirim teks ke aplikasi dengan mengirim
peristiwa tombol individual atau dengan mengedit teks di sekitar kursor dalam kolom teks
aplikasi. Dalam kasus apa pun, Anda menggunakan instance InputConnection
untuk mengirim teks. Untuk mendapatkan instance ini, panggil
InputMethodService.getCurrentInputConnection()
.
Mengedit teks di sekitar kursor
Saat Anda menangani pengeditan teks yang ada dalam kolom teks, beberapa metode yang lebih bermanfaat
dalam BaseInputConnection
di antaranya:
-
getTextBeforeCursor()
-
Mengembalikan
CharSequence
yang berisi jumlah karakter yang diminta sebelum posisi kursor saat ini. -
getTextAfterCursor()
-
Mengembalikan
CharSequence
yang berisi jumlah karakter yang diminta setelah dengan posisi kursor saat ini. -
deleteSurroundingText()
- Menghapus jumlah karakter yang ditentukan sebelum dan setelah kursor posisi saat ini.
-
commitText()
-
Meng-commit
CharSequence
ke kolom teks dan menetapkan posisi kursor baru.
Misalnya, cuplikan berikut menunjukkan cara mengganti empat karakter di sebelah kiri kursor dengan teks "Hello!":
Kotlin
currentInputConnection.also { ic: InputConnection -> ic.deleteSurroundingText(4, 0) ic.commitText("Hello", 1) ic.commitText("!", 1) }
Java
InputConnection ic = getCurrentInputConnection(); ic.deleteSurroundingText(4, 0); ic.commitText("Hello", 1); ic.commitText("!", 1);
Menulis teks sebelum melakukan commit
Jika IME melakukan prediksi teks atau membutuhkan beberapa langkah untuk menulis glyph atau
kata, Anda dapat menampilkan progres di kolom teks hingga pengguna meng-commit kata, lalu Anda
dapat mengganti komposisi sebagian dengan teks yang lengkap. Anda dapat memberikan perlakuan khusus pada
teks dengan menambahkan "span" pada teks saat meneruskannya ke
setComposingText()
.
Cuplikan berikut menunjukkan cara menampilkan progres di kolom teks:
Kotlin
currentInputConnection.also { ic: InputConnection -> ic.setComposingText("Composi", 1) ic.setComposingText("Composin", 1) ic.commitText("Composing ", 1) }
Java
InputConnection ic = getCurrentInputConnection(); ic.setComposingText("Composi", 1); ic.setComposingText("Composin", 1); ic.commitText("Composing ", 1);
Screenshot berikut menunjukkan tampilannya bagi pengguna:



Gambar 3. Menulis teks sebelum memilih.
Mengintersep peristiwa tombol hardware
Meskipun tidak memiliki fokus yang eksplisit, jendela metode input menerima peristiwa tombol hardware terlebih dahulu dan dapat memilih untuk memakainya atau meneruskannya ke aplikasi. Misalnya, Anda mungkin ingin memakai tombol arah untuk menavigasi dalam UI guna memilih kandidat selama penulisan. Anda mungkin juga ingin menekan tombol kembali untuk menutup semua pop-up yang berasal dari jendela metode input.
Untuk mengintersep tombol hardware, ganti
onKeyDown()
dan onKeyUp()
.
Jangan lupa memanggil metode super()
untuk tombol yang tidak ingin ditangani sendiri.
Membuat subjenis IME
Subjenis memungkinkan IME menampilkan beberapa mode input dan bahasa yang didukung oleh IME. Subjenis dapat merepresentasikan:
- Lokal seperti en_US atau fr_FR.
- Mode input seperti suara, keyboard, atau tulisan tangan.
- Gaya, formulir, atau properti input lain khusus IME, seperti tata letak keyboard 10 tombol atau qwerty.
Pada dasarnya, mode dapat berupa teks seperti "keyboard", "voice", dan sebagainya. Subjenis juga dapat menampilkan kombinasi keduanya.
Informasi subjenis digunakan untuk dialog pengalih IME yang tersedia dari baris notifikasi dan juga untuk setelan IME. Informasi tersebut juga memungkinkan framework memunculkan subjenis IME tertentu secara langsung. Saat membuat IME, gunakan fasilitas subjenis, karena fasilitas tersebut membantu pengguna mengidentifikasi dan beralih antar-bahasa dan antar-mode IME.
Anda menentukan subjenis di salah satu file resource XML metode input, menggunakan
elemen <subtype>
. Cuplikan berikut menentukan IME dengan dua
subjenis: subjenis keyboard untuk lokal bahasa Inggris Amerika Serikat, dan subjenis keyboard lainnya untuk
lokal bahasa Prancis:
<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.softkeyboard.Settings" android:icon="@drawable/ime_icon"> <subtype android:name="@string/display_name_english_keyboard_ime" android:icon="@drawable/subtype_icon_english_keyboard_ime" android:imeSubtypeLanguage="en_US" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="somePrivateOption=true" /> <subtype android:name="@string/display_name_french_keyboard_ime" android:icon="@drawable/subtype_icon_french_keyboard_ime" android:imeSubtypeLanguage="fr_FR" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="foobar=30,someInternalOption=false" /> <subtype android:name="@string/display_name_german_keyboard_ime" ... /> </input-method>
Untuk memastikan subjenis diberi label dengan benar di UI, gunakan %s untuk mendapatkan label subjenis yang sama dengan label lokal subjenis. Hal ini ditunjukkan dalam dua cuplikan berikutnya. Cuplikan pertama menunjukkan bagian dari file XML metode input:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
Cuplikan berikutnya adalah bagian dari file strings.xml
IME. Resource
string label_subtype_generic
, yang digunakan oleh definisi UI metode input untuk
menetapkan label subjenis, didefinisikan sebagai:
<string name="label_subtype_generic">%s</string>
Setelan ini membuat nama tampilan subjenis cocok dengan setelan lokal. Misalnya, dalam lokal bahasa Inggris, nama tampilan adalah “English (United States)”.
Memilih subjenis IME dari baris notifikasi
Sistem Android mengelola semua subjenis yang ditampilkan oleh semua IME. Subjenis IME diperlakukan sebagai mode IME yang memilikinya. Di baris notifikasi, pengguna dapat memilih subjenis yang tersedia untuk IME yang saat ini ditetapkan, sebagaimana ditunjukkan dalam screenshot berikut:

Gambar 4. Memilih subjenis IME dari baris notifikasi

Gambar 5. Menyetel preferensi subjenis di Setelan Sistem.
Memilih subjenis IME dari Setelan Sistem
Pengguna dapat mengontrol penggunaan subjenis pada panel setelan “Bahasa & input” di area Setelan Sistem.

Gambar 6. Memilih bahasa untuk IME.
Beralih antar-subjenis IME
Anda dapat mengizinkan pengguna beralih dengan mudah di antara beberapa subjenis IME dengan memberikan tombol pengalih, seperti ikon bahasa berbentuk globe, sebagai bagian dari keyboard. Hal tersebut sangat meningkatkan kegunaan keyboard, dan dapat membantu memudahkan pengguna. Untuk mengaktifkan pengalihan tersebut, lakukan langkah-langkah berikut:
- Deklarasikan
supportsSwitchingToNextInputMethod = "true"
dalam file resource XML metode input. Deklarasi harus mirip dengan cuplikan berikut:<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="com.example.softkeyboard.Settings" android:icon="@drawable/ime_icon" android:supportsSwitchingToNextInputMethod="true">
- Panggil metode
shouldOfferSwitchingToNextInputMethod()
. - Jika metode menampilkan nilai true, tampilkan tombol pengalih.
- Saat pengguna mengetuk tombol pengalih, panggil
switchToNextInputMethod()
, yang meneruskan nilai false ke parameter kedua. Nilai false memberi tahu sistem untuk memperlakukan semua subjenis secara sama, apa pun IME yang miliknya. Sistem harus melewati seluruh subjenis dalam IME saat ini bila menentukan nilai true.
Perhatian: Sebelum Android 5.0 (API level 21),
switchToNextInputMethod()
tidak mengenali atribut supportsSwitchingToNextInputMethod
. Jika beralih
ke IME tanpa tombol pengalih, pengguna dapat terjebak dalam IME tersebut, dan tidak dapat keluar dengan mudah.
Pertimbangan IME umum
Berikut adalah beberapa hal lain yang perlu dipertimbangkan saat Anda mengimplementasikan IME:
- Berikan cara bagi pengguna untuk menetapkan opsi langsung dari UI IME.
- Karena beberapa IME dapat diinstal di perangkat, berikan cara bagi pengguna untuk beralih ke IME yang berbeda langsung dari UI metode input.
- Munculkan UI IME dengan cepat. Pramuat atau muat resource besar on demand agar pengguna dapat langsung melihat IME setelah mengetuk kolom teks. Resource dan tampilan cache untuk pemanggilan metode input berikutnya.
- Sebaliknya, Anda harus segera merilis alokasi memori besar setelah jendela metode input disembunyikan, agar aplikasi memiliki cukup memori untuk berjalan. Pertimbangkan untuk menggunakan pesan tertunda guna merilis resource jika IME dalam status disembunyikan selama beberapa detik.
- Pastikan pengguna dapat memasukkan karakter sebanyak mungkin untuk bahasa atau lokal yang terkait dengan IME. Ingat bahwa pengguna dapat menggunakan tanda baca dalam sandi atau nama pengguna, jadi IME harus menyediakan berbagai karakter agar pengguna dapat memasukkan sandi dan mendapatkan akses ke perangkat.