Giriş yöntemi düzenleyici (IME), kullanıcıların metin girmesine olanak tanıyan bir kullanıcı kontrolüdür. Android, uygulamaların kullanıcılara ekran klavyesi veya konuşma girişi gibi alternatif giriş yöntemleri sunmasına olanak tanıyan genişletilebilir bir giriş yöntemi çerçevesi sağlar. Kullanıcı, IME'leri yükledikten sonra sistem ayarlarından birini seçip tüm sistemde kullanabilir. Aynı anda yalnızca bir IME etkinleştirilebilir.
Android sistemine bir IME eklemek için InputMethodService
sınıfını genişleten bir sınıf içeren bir Android uygulaması oluşturun.
Ayrıca, genellikle IME hizmetine seçenekler ileten bir "ayarlar" etkinliği oluşturursunuz. Ayrıca, sistem ayarlarının bir parçası olarak gösterilen bir ayarlar kullanıcı arayüzü de tanımlayabilirsiniz.
Bu sayfada aşağıdaki konular ele alınmaktadır:
- IME yaşam döngüsü
- Uygulama manifestinde IME bileşenlerini bildirme
- IME API'si
- IME kullanıcı arayüzü tasarlama
- IME'den uygulamaya metin gönderme
- IME alt türleriyle çalışma
- Diğer IME hususları
IME'lerle çalışmadıysanız önce Ekran Üzerindeki Giriş Yöntemleri başlıklı giriş makalesini okuyun.
IME yaşam döngüsü
Aşağıdaki şemada bir IME'nin yaşam döngüsü açıklanmaktadır:

Aşağıdaki bölümlerde, bu yaşam döngüsünü izleyen bir IME ile ilişkili kullanıcı arayüzünün ve kodun nasıl uygulanacağı açıklanmaktadır.
Manifest dosyasında IME bileşenlerini bildirme
Android sisteminde IME, özel bir IME hizmeti içeren bir Android uygulamasıdır. Uygulamanın manifest dosyasında hizmet beyan edilmeli, gerekli izinler istenmeli, action.view.InputMethod
işlemiyle eşleşen bir amaç filtresi sağlanmalı ve IME'nin özelliklerini tanımlayan meta veriler sağlanmalıdır. Ayrıca, kullanıcının IME'nin davranışını değiştirmesine olanak tanıyan bir ayarlar arayüzü sağlamak için Sistem Ayarları'ndan başlatılabilen bir "ayarlar" etkinliği tanımlayabilirsiniz.
Aşağıdaki snippet, bir IME hizmeti bildirir. Hizmetin IME'yi sisteme bağlamasına izin vermek için BIND_INPUT_METHOD
iznini ister, android.view.InputMethod
işlemine karşılık gelen bir amaç filtresi ayarlar ve IME için meta veriler tanımlar:
<!-- 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>
Sonraki snippet, IME için ayarlar etkinliğini bildirir. Aşağıdaki için bir amaç filtresi vardır:
ACTION_MAIN
Bu etkinliğin IME uygulamasının ana giriş noktası olduğunu gösterir:
<!-- 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>
Ayrıca, IME'nin kullanıcı arayüzünden doğrudan IME ayarlarına erişim de sağlayabilirsiniz.
Giriş yöntemi API'si
IME'lere özgü sınıflar android.inputmethodservice
ve android.view.inputmethod
paketlerinde bulunur. KeyEvent
sınıfı, klavye karakterlerini işlemek için önemlidir.
IME'nin merkezi kısmı bir hizmet bileşenidir (InputMethodService
sınıfını genişleten bir sınıf). Bu sınıf, normal hizmet yaşam döngüsünü uygulamanın yanı sıra IME'nizin kullanıcı arayüzünü sağlama, kullanıcı girişini işleme ve metni odaklanmış alana teslim etme için geri çağırma işlevlerine sahiptir. Varsayılan olarak, InputMethodService
sınıfı, IME'nin durumunu ve görünürlüğünü yönetme ve mevcut giriş alanıyla iletişim kurma için gereken uygulamanın büyük bir bölümünü sağlar.
Aşağıdaki sınıflar da önemlidir:
BaseInputConnection
-
Bir giriş alan uygulamadan
InputMethod
uygulamaya geri dönüş için iletişim kanalını tanımlar. İmlecin etrafındaki metni okumak, metni metin kutusuna göndermek ve ham tuş etkinliklerini uygulamaya göndermek için kullanılır. Uygulamalar, temel arayüzü uygulamak yerine bu sınıfı genişletmelidirInputConnection
. KeyboardView
-
View
'nin bir uzantısıdır. Klavye oluşturur ve kullanıcı giriş etkinliklerine yanıt verir. Klavye düzeni, bir XML dosyasında tanımlayabileceğinizKeyboard
örneğiyle belirtilir.
Giriş yöntemi kullanıcı arayüzünü tasarlama
IME'nin iki temel görsel öğesi vardır: Giriş görünümü ve adaylar görünümü. Yalnızca tasarladığınız giriş yöntemiyle alakalı öğeleri uygulamanız gerekir.
Giriş görünümü
Giriş görünümü, kullanıcının tuş tıklamaları, el yazısı veya hareketler şeklinde metin girdiği kullanıcı arayüzüdür. IME ilk kez görüntülendiğinde sistem, onCreateInputView()
geri çağırma işlevini çağırır. Bu yöntemi uygularken IME penceresinde göstermek istediğiniz düzeni oluşturun ve düzeni sisteme döndürün. Aşağıdaki snippet'te onCreateInputView()
yönteminin uygulanmasına dair bir örnek gösterilmektedir:
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; }
Bu örnekte, MyKeyboardView
, KeyboardView
öğesinin Keyboard
oluşturacak özel bir uygulamasının örneğidir.
Aday görünümü
Adaylar görünümü, IME'nin kullanıcının seçmesi için olası kelime düzeltmelerini veya önerilerini gösterdiği kullanıcı arayüzüdür. IME yaşam döngüsünde, sistem aday görünümünü göstermeye hazır olduğunda onCreateCandidatesView()
işlevini çağırır.
onCreateCandidatesView()
Bu yöntemi uygularken kelime önerilerini gösteren bir düzen döndürün veya hiçbir şey göstermek istemiyorsanız boş değer döndürün. Boş yanıt varsayılan davranıştır. Bu nedenle, öneri sağlamıyorsanız bunu uygulamanız gerekmez.
Kullanıcı arayüzü tasarımı ile ilgili dikkat edilmesi gereken noktalar
Bu bölümde, IME'ler için kullanıcı arayüzü tasarımında dikkat edilmesi gereken bazı noktalar açıklanmaktadır.
Birden fazla ekran boyutunu işleme
IME'nizin kullanıcı arayüzü, farklı ekran boyutlarına göre ölçeklenebilmeli ve hem yatay hem de dikey yönlendirmeyi desteklemelidir. Tam ekran olmayan IME modunda, uygulamanın metin alanını ve ilişkili bağlamı göstermesi için yeterli alan bırakın. Böylece, ekranın yarısından fazlası IME tarafından kaplanmaz. Tam ekran IME modunda bu bir sorun değildir.
Farklı giriş türlerini işleme
Android metin alanları, serbest biçimli metin, sayılar, URL'ler, e-posta adresleri ve arama dizeleri gibi belirli bir giriş türü ayarlamanıza olanak tanır. Yeni bir IME uyguladığınızda her alanın giriş türünü algılayın ve uygun arayüzü sağlayın. Ancak, kullanıcının giriş türü için geçerli metin girip girmediğini kontrol etmek üzere IME'nizi ayarlamanız gerekmez. Bu, metin alanının sahibi olan uygulamanın sorumluluğundadır.
Örneğin, Latin IME'nin Android platformu metin girişi için sağladığı arayüz aşağıda verilmiştir:

Latin IME'nin Android platformu için sağladığı arayüzde sayısal giriş şu şekilde yapılır:

Bir giriş alanı odaklandığında ve IME'niz başladığında sistem, giriş türü ve metin alanının diğer özellikleri hakkında ayrıntılar içeren bir onStartInputView()
nesnesi ileterek EditorInfo
işlevini çağırır. Bu nesnede, inputType
alanı metin alanının giriş türünü içerir.
inputType
alanı, çeşitli giriş türü ayarlarının bit desenlerini içeren bir int
'dir. Metin alanının giriş türü için test etmek üzere, TYPE_MASK_CLASS
sabitiyle maskeleyin. Örneğin:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Giriş türü bit deseni, aşağıdakiler de dahil olmak üzere çeşitli değerlere sahip olabilir:
TYPE_CLASS_NUMBER
- Sayıların girileceği bir metin alanı. Şekil 3'te gösterildiği gibi, Latin IME bu türdeki alanlar için sayısal tuş takımı gösterir.
TYPE_CLASS_DATETIME
- Tarih ve saat girmek için kullanılan metin alanı.
TYPE_CLASS_PHONE
- Telefon numaralarının girileceği bir metin alanı.
TYPE_CLASS_TEXT
- Desteklenen karakterlerin girilebileceği bir metin alanı.
Bu sabitler, InputType
ile ilgili referans belgelerinde daha ayrıntılı olarak açıklanmıştır.
inputType
alanı, metin alanı türünün bir varyantını gösteren başka bitler içerebilir. Örneğin:
TYPE_TEXT_VARIATION_PASSWORD
- Şifre girmek için
TYPE_CLASS_TEXT
varyantı. Giriş yöntemi, gerçek metin yerine dingbat karakterleri gösteriyor. TYPE_TEXT_VARIATION_URI
- Web URL'lerini ve diğer Tek Tip Kaynak Tanımlayıcıları (URI'ler) girmek için kullanılan
TYPE_CLASS_TEXT
varyantı. TYPE_TEXT_FLAG_AUTO_COMPLETE
- Uygulamanın sözlük, arama veya başka bir tesisten otomatik olarak tamamladığı metinleri girmek için kullanılan
TYPE_CLASS_TEXT
varyantı.
Bu varyantları test ederken inputType
değerini uygun sabit ile maskeleyin. Kullanılabilir maske sabitleri, InputType
ile ilgili referans belgelerinde listelenmiştir.
Uygulamaya metin gönderme
Kullanıcı, IME'nizle metin girerken tek tek tuş etkinlikleri göndererek veya uygulamadaki metin alanında imlecin etrafındaki metni düzenleyerek uygulamaya metin gönderebilirsiniz. Her iki durumda da metni iletmek için InputConnection
örneğini kullanın. Bu örneği almak için InputMethodService.getCurrentInputConnection()
numaralı telefonu arayın.
İmlecin etrafındaki metni düzenleme
Mevcut metinlerin düzenlenmesiyle uğraşırken BaseInputConnection
içinde kullanabileceğiniz bazı yararlı yöntemler şunlardır:
-
getTextBeforeCursor()
- Geçerli imleç konumundan önce istenen karakter sayısını içeren bir
CharSequence
döndürür. -
getTextAfterCursor()
- Geçerli imleç konumundan sonraki istenen karakter sayısını içeren bir
CharSequence
döndürür. -
deleteSurroundingText()
- Geçerli imleç konumundan önce ve sonra belirtilen sayıda karakteri siler.
-
commitText()
- Metin alanına bir
CharSequence
ekler ve yeni bir imleç konumu ayarlar.
Örneğin, aşağıdaki snippet'te imlecin solundaki dört karakterin "Hello!" metniyle nasıl değiştirileceği gösterilmektedir:
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);
Kaydetmeden önce metin oluşturma desteği
IME'niz metin tahmin ediyorsa veya bir glif ya da kelime oluşturmak için birden fazla adım gerektiriyorsa kullanıcı kelimeyi onaylayana kadar metin alanındaki ilerleme durumunu gösterebilir, ardından kısmi oluşturmayı tamamlanmış metinle değiştirebilirsiniz. Metni setComposingText()
işlevine iletirken metne span ekleyerek metne özel işlem uygulayabilirsiniz.
Aşağıdaki snippet, ilerleme durumunun bir metin alanında nasıl gösterileceğini gösterir:
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);
Donanım tuşu etkinliklerini yakalama
Giriş yöntemi penceresi açıkça odaklanmamış olsa da donanım tuşu etkinliklerini önce alır ve bunları kullanabilir veya uygulamaya iletebilir. Örneğin, beste oluşturma sırasında aday seçimi için kullanıcı arayüzünüzde gezinmek üzere yön tuşlarını kullanmak isteyebilirsiniz. Giriş yöntemi penceresinden kaynaklanan iletişim kutularını kapatmak için geri tuşunu da yakalamak isteyebilirsiniz.
Donanım anahtarlarını yakalamak için onKeyDown()
ve onKeyUp()
işlevlerini geçersiz kılın.
Kendiniz işlemek istemediğiniz anahtarlar için super()
yöntemini çağırın.
IME alt türü oluşturma
Alt türler, IME'nin desteklediği birden fazla giriş modunu ve dili IME'ye sunmasına olanak tanır. Bir alt tür aşağıdakileri temsil edebilir:
- Yerel ayar (ör. en_US veya fr_FR)
- Ses, klavye veya el yazısı gibi bir giriş modu
- 10 tuşlu veya QWERTY klavye düzenleri gibi IME'ye özgü diğer giriş stilleri, formlar veya özellikler
Mod, "klavye" veya "ses" gibi herhangi bir metin olabilir. Bir alt tür de bunların bir kombinasyonunu gösterebilir.
Alt tür bilgileri, bildirim çubuğundan erişilebilen bir IME değiştirici iletişim kutusu ve IME ayarları için kullanılır. Bu bilgiler, çerçevenin doğrudan belirli bir IME alt türünü getirmesine de olanak tanır. IME oluştururken, kullanıcının farklı IME dillerini ve modlarını tanımlayıp bunlar arasında geçiş yapmasına yardımcı olduğundan alttür özelliğini kullanın.
<subtype>
öğesini kullanarak giriş yönteminin XML kaynak dosyalarından birinde alt türleri tanımlayın. Aşağıdaki kod snippet'inde iki alt türü olan bir IME tanımlanmaktadır: ABD İngilizcesi yerel ayarı için bir klavye alt türü ve Fransa'daki Fransızca yerel ayarı için başka bir klavye alt türü:
<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>
Alt türlerinizin kullanıcı arayüzünde doğru şekilde etiketlendiğinden emin olmak için alt türün yerel ayar etiketiyle aynı olan bir alt tür etiketi almak üzere `%s` kullanın. Bu durum, sonraki iki kod snippet'inde gösterilmektedir. İlk snippet, giriş yönteminin XML dosyasının bir bölümünü gösterir:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
Aşağıdaki snippet, IME'nin strings.xml
dosyasının bir parçasıdır. Alt türün etiketini ayarlamak için giriş yöntemi kullanıcı arayüzü tanımında kullanılan dize kaynağı label_subtype_generic
şu şekilde tanımlanır:
<string name="label_subtype_generic">%s</string>
Bu ayar, alt türün görünen adının yerel ayar ile eşleşmesine neden olur. Örneğin, herhangi bir İngilizce yerel ayarında görünen ad "English (United States)" olur.
Bildirim çubuğundan IME alt türlerini seçme
Android sistemi, tüm IME'ler tarafından sunulan tüm alt türleri yönetir. IME alt türleri, ait oldukları IME'nin modları olarak kabul edilir. Kullanıcı, bildirim çubuğundan veya Ayarlar uygulamasından aşağıdaki şekilde gösterildiği gibi, kullanılabilir IME alt türlerinin menüsüne gidebilir:

Sistem Ayarları'ndan IME alt türlerini seçme
Kullanıcı, sistem ayarlarındaki Dil ve giriş ayarları panelinde alt türlerin nasıl kullanılacağını da kontrol edebilir:

IME alt türleri arasında geçiş yapma
Kullanıcılara klavyedeki dünya şeklindeki dil simgesi gibi bir geçiş tuşu sağlayarak IME alt türleri arasında kolayca geçiş yapmalarına olanak tanıyabilirsiniz. Bu sayede klavyenin kullanılabilirliği artar ve kullanıcıya kolaylık sağlanır. Bu geçişi etkinleştirmek için aşağıdaki adımları uygulayın:
- Giriş yönteminin XML kaynak dosyalarında
supportsSwitchingToNextInputMethod = "true"
öğesini bildirin. Beyanınız aşağıdaki kod snippet'ine benzer olmalıdır:<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">
shouldOfferSwitchingToNextInputMethod()
yöntemini çağırın.- Yöntem doğru değerini döndürürse bir geçiş anahtarı gösterin.
- Kullanıcı geçiş tuşuna dokunduğunda call
switchToNextInputMethod()
, false iletilir. Değerin yanlış olması, sisteme hangi IME'ye ait olduklarına bakılmaksızın tüm alt türlere eşit davranması gerektiğini söyler. Doğru değerinin belirtilmesi, sistemin mevcut IME'deki alt türler arasında geçiş yapmasını gerektirir.
IME ile ilgili genel bilgiler
IME'nizi uygularken göz önünde bulundurmanız gereken diğer noktalar:
- Kullanıcılara seçenekleri doğrudan IME'nin kullanıcı arayüzünden ayarlama olanağı sunun.
- Cihazda birden fazla IME yüklü olabileceğinden, kullanıcıların doğrudan giriş yöntemi kullanıcı arayüzünden farklı bir IME'ye geçmesine olanak tanıyın.
- IME'nin kullanıcı arayüzünü hızlıca açma Kullanıcılar bir metin alanına dokundukları anda IME'yi görebilmeleri için büyük kaynakları önceden yükleyin veya isteğe bağlı olarak yükleyin. Giriş yönteminin sonraki çağrıları için kaynakları ve görünümleri önbelleğe alın.
- Giriş yöntemi penceresi gizlendikten hemen sonra büyük bellek ayırmalarını serbest bırakarak uygulamaların çalışması için yeterli belleğe sahip olmasını sağlayın. IME birkaç saniye gizlenirse kaynakları serbest bırakmak için gecikmeli mesaj kullanın.
- Kullanıcıların IME ile ilişkili dil veya yerel ayar için mümkün olduğunca çok karakter girebildiğinden emin olun. Kullanıcılar şifrelerde veya kullanıcı adlarında noktalama işaretleri kullanabilir. Bu nedenle, IME'niz, kullanıcıların şifre girmesine ve cihaza erişmesine olanak tanımak için birçok farklı karakter sağlamalıdır.