Editor metode input (IME) adalah kontrol pengguna yang memungkinkan pengguna memasukkan teks. Android menyediakan framework metode input yang dapat diperluas yang memungkinkan aplikasi menyediakan metode input alternatif kepada pengguna, seperti keyboard virtual atau input ucapan. Setelah menginstal IME, pengguna dapat memilih salah satu dari setelan sistem dan menggunakannya di seluruh sistem. Hanya satu IME yang dapat diaktifkan dalam satu waktu.
Untuk menambahkan IME ke sistem Android, buat aplikasi Android yang 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.
Halaman ini membahas beberapa topik berikut:
- Siklus proses IME
- Mendeklarasikan komponen IME dalam manifes aplikasi
- IME API
- Mendesain UI IME
- Mengirim teks dari IME ke aplikasi
- Menggunakan subjenis IME
- Pertimbangan IME lainnya
Jika Anda belum pernah menggunakan IME, baca artikel pengantar Metode Input di Layar terlebih dahulu.
Siklus proses IME
Diagram berikut menjelaskan siklus proses IME:
Bagian berikut menjelaskan cara mengimplementasikan UI dan kode yang terkait dengan 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 menentukan 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. Layanan ini meminta izin
BIND_INPUT_METHOD
agar layanan dapat menghubungkan IME ke sistem, menyiapkan filter intent yang cocok dengan tindakan
android.view.InputMethod, dan menentukan 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. Aktivitas 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 untuk IME dapat ditemukan dalam paket
android.inputmethodservice
dan
android.view.inputmethod. Class KeyEvent penting untuk menangani karakter keyboard.
Bagian tengah IME adalah komponen layanan—class yang memperluas
InputMethodService. Selain mengimplementasikan siklus proses layanan normal, class ini
memiliki callback untuk menyediakan UI IME, menangani input pengguna, dan mengirimkan teks ke
kolom yang 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
InputMethodkembali ke aplikasi yang menerima inputnya. 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
Viewyang merender keyboard dan merespons peristiwa input pengguna. Tata letak keyboard ditentukan oleh instanceKeyboard, yang dapat Anda tentukan dalam file XML.
Mendesain UI metode input
Ada dua elemen visual utama untuk IME: tampilan input dan tampilan kandidat. Anda hanya perlu mengimplementasikan elemen yang relevan dengan metode input yang Anda desain.
Tampilan input
Tampilan input adalah UI tempat pengguna memasukkan teks dalam bentuk penekanan 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 Anda tampilkan di jendela IME
dan tampilkan tata letak ke sistem. Cuplikan berikut menunjukkan contoh penerapan
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 atau saran kata
untuk dipilih pengguna. Dalam siklus proses IME, sistem memanggil
onCreateCandidatesView()
saat siap menampilkan tampilan kandidat. Dalam penerapan metode ini, tampilkan
tata letak yang menampilkan saran kata, atau tampilkan null jika Anda tidak ingin menampilkan apa pun. Respons null
adalah perilaku default, jadi Anda tidak perlu menerapkannya jika tidak memberikan
saran.
Pertimbangan desain UI
Bagian ini menjelaskan beberapa pertimbangan desain UI untuk IME.
Menangani beberapa ukuran layar
UI untuk IME Anda harus dapat diskalakan untuk berbagai ukuran layar dan menangani orientasi lanskap dan potret. Dalam mode IME non-layar penuh, sisakan ruang yang cukup bagi aplikasi untuk menampilkan kolom teks dan konteks terkait, sehingga tidak lebih dari setengah layar yang ditempati oleh IME. Dalam mode IME layar penuh, hal ini tidak menjadi masalah.
Menangani jenis input berbeda
Kolom teks Android memungkinkan Anda menetapkan jenis input tertentu, seperti teks bentuk bebas, angka, URL, alamat email, dan string penelusuran. Saat Anda menerapkan IME baru, deteksi jenis input setiap kolom dan sediakan antarmuka yang sesuai untuk kolom tersebut. Namun, Anda tidak perlu menyiapkan IME untuk memeriksa apakah pengguna memasukkan teks yang valid untuk jenis input. Hal ini merupakan tanggung jawab aplikasi yang memiliki kolom teks.
Misalnya, berikut adalah antarmuka yang disediakan IME Latin untuk input teks platform Android:
Berikut adalah antarmuka yang disediakan IME Latin untuk input numerik platform Android:
Saat kolom input menerima fokus dan IME Anda dimulai, sistem akan memanggil
onStartInputView(),
dengan meneruskan
objek EditorInfo
yang berisi detail tentang jenis input dan atribut lain dari 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. Untuk mengujinya pada jenis input kolom teks, tutupi 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 salah satu dari beberapa nilai, termasuk:
TYPE_CLASS_NUMBER- Kolom teks untuk memasukkan angka. Seperti yang diilustrasikan dalam gambar 3, 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 karakter yang didukung.
Konstanta ini dijelaskan secara 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_TEXTuntuk memasukkan sandi. Metode input menampilkan dingbat, bukan teks sebenarnya. TYPE_TEXT_VARIATION_URI- Varian
TYPE_CLASS_TEXTuntuk memasukkan URL web dan Uniform Resource Identifier (URI) lainnya. TYPE_TEXT_FLAG_AUTO_COMPLETE- Varian
TYPE_CLASS_TEXTuntuk memasukkan teks yang dilengkapi otomatis oleh aplikasi dari kamus, penelusuran, atau fasilitas lainnya.
Tutupi inputType dengan konstanta yang sesuai saat Anda menguji varian ini. Konstanta mask yang tersedia tercantum dalam dokumentasi referensi untuk InputType.
Mengirim teks ke aplikasi
Saat pengguna memasukkan teks dengan IME Anda, Anda dapat mengirim teks ke aplikasi dengan mengirim masing-masing
peristiwa utama atau dengan mengedit teks di sekitar kursor dalam kolom teks aplikasi. Dalam kedua kasus tersebut,
gunakan instance InputConnection untuk mengirimkan teks. Untuk mendapatkan instance ini, panggil
InputMethodService.getCurrentInputConnection().
Mengedit teks di sekitar kursor
Saat Anda menangani pengeditan teks yang ada, beberapa metode yang berguna di
BaseInputConnection adalah sebagai berikut:
-
getTextBeforeCursor() - Menampilkan
CharSequenceyang berisi jumlah karakter yang diminta sebelum posisi kursor saat ini. -
getTextAfterCursor() - Menampilkan
CharSequenceyang berisi jumlah karakter yang diminta setelah posisi kursor saat ini. -
deleteSurroundingText() - Menghapus jumlah karakter yang ditentukan sebelum dan setelah posisi kursor saat ini.
-
commitText() - Melakukan commit
CharSequenceke kolom teks dan menetapkan posisi kursor baru.
Misalnya, cuplikan berikut menunjukkan cara mengganti empat karakter di sebelah kiri kursor dengan teks "Halo!":
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);
Mendukung penulisan teks sebelum melakukan commit
Jika IME Anda memprediksi teks atau memerlukan beberapa langkah untuk menulis glyph atau kata, Anda dapat menampilkan
progres di kolom teks hingga pengguna mengonfirmasi kata, lalu Anda dapat mengganti komposisi
parsial dengan teks yang sudah selesai. Anda dapat memberikan perlakuan khusus pada teks dengan menambahkan
span ke teks tersebut 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);
Mengintersep peristiwa tombol hardware
Meskipun jendela metode input tidak memiliki fokus yang jelas, jendela ini menerima peristiwa tombol hardware terlebih dahulu dan dapat menggunakannya atau meneruskannya ke aplikasi. Misalnya, Anda mungkin ingin menggunakan tombol arah untuk menavigasi dalam UI untuk pemilihan kandidat selama komposisi. Anda mungkin juga ingin menjebak tombol kembali untuk menutup dialog apa pun yang berasal dari jendela metode input.
Untuk mengintersep tombol hardware, ganti
onKeyDown()
dan
onKeyUp().
Panggil metode super() untuk kunci yang tidak ingin Anda tangani sendiri.
Membuat subjenis IME
Subjenis memungkinkan IME mengekspos beberapa mode input dan bahasa yang didukung oleh IME. Subjenis dapat mewakili hal berikut:
- Lokalitas, seperti en_US atau fr_FR
- Mode input, seperti suara, keyboard, atau tulisan tangan
- Gaya, bentuk, atau properti input lain yang khusus untuk IME, seperti tata letak keyboard 10 tombol atau QWERTY
Mode dapat berupa teks apa pun, seperti "keyboard" atau "suara". Subjenis juga dapat mengekspos kombinasi dari hal ini.
Informasi subjenis digunakan untuk dialog pengalih IME yang tersedia dari panel notifikasi dan untuk setelan IME. Informasi ini juga memungkinkan framework memunculkan subjenis IME tertentu secara langsung. Saat Anda membuat IME, gunakan fasilitas subjenis, karena fasilitas ini membantu pengguna mengidentifikasi dan beralih di antara berbagai bahasa dan mode IME.
Tentukan subjenis di salah satu file resource XML metode input, menggunakan
elemen <subtype>. Cuplikan kode berikut menentukan IME dengan dua subjenis: subjenis
keyboard untuk lokalitas bahasa Inggris AS dan subjenis keyboard lain untuk lokalitas bahasa
Prancis untuk 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:languageTag="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:languageTag="fr-FR" android:imeSubtypeMode="keyboard" android:imeSubtypeExtraValue="someVariable=30,someInternalOption=false" /> <subtype android:name="@string/display_name_german_keyboard_ime" ... /> </input-method>
Untuk memastikan subjenis Anda diberi label dengan benar di UI, gunakan `%s` untuk mendapatkan label subjenis yang sama dengan label lokalitas subjenis. Hal ini ditunjukkan dalam dua cuplikan kode 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 berikut:
<string name="label_subtype_generic">%s</string>Setelan ini menyebabkan nama tampilan subjenis cocok dengan setelan lokalitas. Misalnya, di lokalitas bahasa Inggris, nama tampilannya 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 dimilikinya. Pengguna dapat membuka menu subjenis IME yang tersedia dari panel notifikasi atau aplikasi Setelan, seperti yang ditunjukkan pada gambar berikut:
Memilih subjenis IME dari Setelan Sistem
Pengguna juga dapat mengontrol cara penggunaan subjenis di panel setelan Bahasa & input di setelan sistem:
Beralih antar-subjenis IME
Anda dapat mengizinkan pengguna beralih dengan mudah di antara subjenis IME dengan menyediakan tombol akses, seperti ikon bahasa berbentuk globe di keyboard. Hal ini meningkatkan kegunaan keyboard dan memudahkan pengguna. Untuk mengaktifkan peralihan ini, lakukan langkah-langkah berikut:
- Deklarasikan
supportsSwitchingToNextInputMethod = "true"dalam file resource XML metode input. Deklarasi Anda harus terlihat mirip dengan cuplikan kode 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 akses, panggil
switchToNextInputMethod(), dengan meneruskan false. Nilai false memberi tahu sistem untuk memperlakukan semua subjenis secara setara, terlepas dari IME yang dimilikinya. Menentukan true mengharuskan sistem untuk beralih di antara subjenis dalam IME saat ini.
Pertimbangan IME umum
Berikut adalah hal-hal lain yang perlu dipertimbangkan saat Anda mengimplementasikan IME:
- Menyediakan cara bagi pengguna untuk menetapkan opsi langsung dari UI IME.
- Menyediakan cara bagi pengguna untuk beralih ke IME lain langsung dari UI metode input, karena beberapa IME mungkin diinstal di perangkat.
- Munculkan UI IME dengan cepat. Pramuat atau muat sesuai permintaan resource besar apa pun sehingga pengguna melihat IME segera setelah mereka mengetuk kolom teks. Resource dan tampilan cache untuk pemanggilan metode input berikutnya.
- Segera lepaskan alokasi memori yang besar setelah jendela metode input disembunyikan, sehingga aplikasi memiliki memori yang cukup untuk dijalankan. Gunakan pesan tertunda untuk merilis resource jika IME disembunyikan selama beberapa detik.
- Pastikan pengguna dapat memasukkan karakter sebanyak mungkin untuk bahasa atau lokalitas yang terkait dengan IME. Pengguna mungkin menggunakan tanda baca dalam sandi atau nama pengguna, sehingga IME Anda harus menyediakan banyak karakter yang berbeda agar pengguna dapat memasukkan sandi dan mengakses perangkat.