Giriş yöntemi düzenleyici (IME), kullanıcıların metin girmesine olanak tanıyan bir kullanıcı denetimidir. Android, uygulamaların kullanıcılara ekran klavyeleri 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 sistemin tamamında 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 aktaran bir "ayarlar" etkinliği oluşturursunuz. Sistem ayarlarının bir parçası olarak görüntülenen bir ayar 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 beyan etme
- IME API'si
- IME kullanıcı arayüzü tasarlama
- IME'den uygulamaya kısa mesaj gönderme
- IME alt türleriyle çalışma
- Diğer IME ile ilgili noktalar
IME'lerle çalışmadıysanız önce Ekran 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 intent 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ılabilecek bir "ayarlar" etkinliği tanımlayabilirsiniz.
Aşağıdaki snippet'te bir IME hizmeti tanımlanmaktadır. Hizmetin IME'yi sisteme bağlamasına izin vermeBIND_INPUT_METHOD
izinini ister, işlemle (android.view.InputMethod
) eşleşen bir intent filtresi oluşturur ve IME için meta verileri 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>
Aşağıdaki snippet'te, IME için ayarlar etkinliği belirtilmektedir. Bu etkinlik, ACTION_MAIN
için bu etkinliğin IME uygulamasının ana giriş noktası olduğunu belirten bir intent filtresine sahiptir:
<!-- 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, doğrudan IME'nin kullanıcı arayüzünden IME'nin ayarlarına erişim 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 karakterlerinin işlenmesi için önemlidir.
Bir IME'nin orta kısmı, InputMethodService
öğesini genişleten bir sınıf olan hizmet bileşenidir. Bu sınıfta, normal hizmet yaşam döngüsünü uygulamanın yanı sıra IME'nizin kullanıcı arayüzünü sağlamak, kullanıcı girişini yönetmek ve odaklanılan alana metin göndermek için geri çağırma işlevleri bulunur. Varsayılan olarak InputMethodService
sınıfı, IME'nin durumunu ve görünürlüğünü yönetmek ve mevcut giriş alanıyla iletişim kurmak için uygulamanın büyük bir kısmını sağlar.
Aşağıdaki sınıflar da önemlidir:
BaseInputConnection
-
Bir
InputMethod
kaynağından girişini alan uygulamaya kadar olan iletişim kanalını tanımlar. Bu alanı imlecin etrafındaki metni okumak, metin kutusuna metin kaydetmek ve ham önemli etkinlikleri uygulamaya göndermek için kullanırsınız. Uygulamalar, temelInputConnection
arayüzünü uygulamak yerine bu sınıfı genişletmelidir. KeyboardView
-
Klavye oluşturan ve kullanıcı girişi etkinliklerine yanıt veren bir
View
uzantısı. Klavye düzeni, bir XML dosyasında tanımlayabileceğinizKeyboard
örneğiyle belirtilir.
Giriş yöntemi kullanıcı arayüzünü tasarlama
IME'de iki ana görsel öğe vardır: giriş görünümü ve adaylar görünümü. Yalnızca tasarladığınız giriş yöntemiyle ilgili öğeleri uygulamanız gerekir.
Giriş görünümü
Giriş görünümü, kullanıcının tuşa tıklama, el yazısı veya hareketler biçiminde metin girdiği kullanıcı arayüzüdür. IME ilk kez görüntülendiğinde sistem, onCreateInputView()
geri çağırmasını çağırır. Bu yöntemi uygularken IME penceresinde görüntülemek istediğiniz düzeni oluşturun ve düzeni sisteme döndürün. Aşağıdaki snippet'te, onCreateInputView()
yönteminin uygulanmasına ilişkin 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
için Keyboard
öğesini oluşturan özel bir uygulama örneğidir.
Adaylar 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, adayların görünümünü göstermeye hazır olduğunda onCreateCandidatesView()
metodunu çağırır. Bu yöntemi uygulamanızda kelime önerileri gösteren bir düzen döndürün ya da herhangi bir şey göstermek istemiyorsanız null değerini döndürün. Boş yanıt, varsayılan davranıştır. Bu nedenle, önerida bulunmazsanız bunu uygulamanız gerekmez.
Kullanıcı arayüzü tasarımında dikkat edilmesi gereken noktalar
Bu bölümde, IME'lerle ilgili bazı kullanıcı arayüzü tasarımı hususları 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önleri 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 IME, ekranın yarısından fazlasını kaplamaz. 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ünü ayarlamanıza olanak tanır. Yeni bir IME uyguladığınızda, her alanın giriş türünü algılayın ve buna 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ıza gerek yoktur. 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çe IME'nin Android platformu için sayısal giriş sağlayan arayüzü aşağıda verilmiştir:
Bir giriş alanı odaklandığında ve IME'niz başladığında sistem, giriş türü ve metin alanının diğer özellikleriyle ilgili ayrıntıları içeren bir EditorInfo
nesnesi göndererek onStartInputView()
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 kalıplarını içeren bir int
'tır. Metin alanının giriş türü için test etmek üzere sabit TYPE_MASK_CLASS
ile maskeleyebilirsiniz. Örneğin:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Giriş türü bit deseni aşağıdakiler gibi çeşitli değerlerden birine sahip olabilir:
TYPE_CLASS_NUMBER
- Sayı girmek için bir metin alanı. Şekil 3'te gösterildiği gibi, Latince IME'de bu tür alanlar için bir sayısal tuş takımı gösterilir.
TYPE_CLASS_DATETIME
- Tarih ve saat girmek için bir metin alanı.
TYPE_CLASS_PHONE
- Telefon numaralarının girileceği bir metin alanı.
TYPE_CLASS_TEXT
- Desteklenen karakterleri girebileceğiniz bir metin alanı.
Bu sabit değerler, InputType
referans belgelerinde daha ayrıntılı olarak açıklanmıştır.
inputType
alanı, metin alanı türünün bir varyantını belirten diğer bitleri içerebilir. Örneğin:
TYPE_TEXT_VARIATION_PASSWORD
- Şifre girmek için kullanılan
TYPE_CLASS_TEXT
varyantı. Giriş yöntemi, gerçek metin yerine dingbat'lar gösterir. TYPE_TEXT_VARIATION_URI
- Web URL'lerini ve diğer tek tip kaynak tanımlayıcılarını (URI'ler) girmek için
TYPE_CLASS_TEXT
'nin bir varyantı. TYPE_TEXT_FLAG_AUTO_COMPLETE
- Uygulamanın bir sözlükten, aramadan veya başka bir kaynaktan otomatik olarak tamamladığı metni girmek için
TYPE_CLASS_TEXT
'un bir varyantı.
Bu varyantları test ederken inputType
değerini uygun sabit değerle maskeleyin. Kullanılabilir maske sabitleri, InputType
için referans dokümanlarında listelenir.
Uygulamaya metin gönderme
Kullanıcı IME'nizle metin girerken tek tek tuş etkinlikleri göndererek veya uygulamanın metin alanındaki imlecin etrafındaki metni düzenleyerek uygulamaya metin gönderebilirsiniz. Her iki durumda da metni yayınlamak için InputConnection
örneği kullanın. Bu örneği almak için InputMethodService.getCurrentInputConnection()
numaralı telefonu arayın.
İmlecin etrafındaki metni düzenleme
Mevcut metinleri düzenlerken BaseInputConnection
ürünündeki yararlı yöntemlerden bazıları şunlardır:
-
getTextBeforeCursor()
- Mevcut imleç konumundan önce istenen karakterlerin sayısını içeren bir
CharSequence
döndürür. -
getTextAfterCursor()
- Mevcut imleç konumundan sonra istenen karakter sayısını içeren bir
CharSequence
döndürür. -
deleteSurroundingText()
- Mevcut imleç konumundan önce ve sonra belirtilen sayıda karakteri siler.
-
commitText()
- Metin alanına bir
CharSequence
gönderir ve yeni bir imleç konumu belirler.
Örneğin, aşağıdaki snippet'te imlecin solunda bulunan dört karakterin "Merhaba" 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şturmayı destekleyin
IME'niz metni tahmin ediyorsa veya bir karakter veya kelime oluşturmak için birden fazla adım gerekiyorsa kullanıcı kelimeyi gönderene kadar metin alanında ilerleme durumunu gösterebilir ve ardından kısmi oluşumu tamamlanmış metinle değiştirebilirsiniz. setComposingText()
'a ilettiğinizde metne span ekleyerek metne özel değerlendirme yapabilirsiniz.
Aşağıdaki snippet'te, bir metin alanında ilerlemenin nasıl gösterileceği gösterilmektedir:
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 anahtar etkinliklerini durdurma
Giriş yöntemi penceresi açıkça odaklanmamış olsa bile donanım tuş etkinliklerini ilk olarak alır ve bunları kullanabilir veya uygulamaya iletebilir. Örneğin, 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 gelen iletişim kutularını kapatmak için geri tuşunu da yakalamanız önerilir.
Donanım anahtarlarını almak için onKeyDown()
ve onKeyUp()
değerlerini geçersiz kılın.
Kendiniz kullanmak 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 göstermesine olanak tanır. Alt türler aşağıdakileri temsil edebilir:
- en_US veya fr_FR gibi bir yerel ayar
- 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 özellikleri
Mod, "klavye" veya "ses" gibi herhangi bir metin olabilir. Bir alt tür de bunların bir kombinasyonunu sunabilir.
Alt tür bilgileri, bildirim çubuğundan erişilebilen IME değiştirici iletişim kutusu ve IME ayarları için kullanılır. Bu bilgiler, çerçevenin doğrudan bir IME alt türünü göstermesine de olanak tanır. Bir IME oluştururken alt tür özelliğini kullanın. Bu özellik, kullanıcının farklı IME dillerini ve modlarını tanımlamasına ve bunlar arasında geçiş yapmasına yardımcı olur.
<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'nın 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 "%s" kullanarak alt türün yerel ayar etiketiyle aynı olan bir alt tür etiketi alın. Bu durum, sonraki iki kod snippet'inde gösterilmektedir. İlk snippet, giriş yönteminin XML dosyasının bir kısmını gösterir:
<subtype android:label="@string/label_subtype_generic" android:imeSubtypeLocale="en_US" android:icon="@drawable/icon_en_us" android:imeSubtypeMode="keyboard" />
Sonraki 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ı tarafından kullanılan dize kaynağı label_subtype_generic
aşağıdaki gibi tanımlanır:
<string name="label_subtype_generic">%s</string>
Bu ayar, alt türün görünen adının yerel ayarıyla eşleşmesine neden olur. Örneğin, İngilizce yerel ayarlarında görünen ad "İngilizce (ABD)" 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 bulunduğu bir menüye 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ıldığını da kontrol edebilir:
IME alt türleri arasında geçiş yapma
Klavyedeki yerküre şeklindeki dil simgesi gibi bir geçiş tuşu sağlayarak kullanıcıların IME alt türleri arasında kolayca geçiş yapmasını sağlayabilirsiniz. Bu, klavyenin kullanılabilirliğini artırır ve kullanıcı için kullanışlıdı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 tanımlayın. Beyanınız aşağıdaki kod snippet'ine benzer şekilde görünmelidir:<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 true değerini döndürürse bir geçiş anahtarı gösterin.
- Kullanıcı geçiş anahtarına dokunduğunda
switchToNextInputMethod()
yöntemini çağırarak false (yanlış) değerini iletin. false değeri, sisteme hangi IME'ye ait olduklarına bakılmaksızın tüm alt türleri eşit şekilde işlemesi gerektiğini söyler. Doğru değerini belirtmek, sistemin mevcut IME'deki alt türleri taramasını gerektirir.
Genel IME ile ilgili dikkat edilmesi gereken noktalar
IME'nizi uygularken göz önünde bulundurmanız gereken diğer noktalar şunlardır:
- Kullanıcıların seçenekleri doğrudan IME'nin kullanıcı arayüzünden ayarlayabileceği bir yöntem sağlayın.
- 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çmesini sağlayın.
- IME'nin kullanıcı arayüzünü hızlıca açın. Kullanıcıların bir metin alanına dokundukları anda IME'yi görmeleri 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ır.
- Uygulamaların çalışacak yeterli belleğe sahip olması için giriş yöntemi penceresi gizlendikten hemen sonra büyük bellek ayırma işlemlerini serbest bırakın. IME birkaç saniye boyunca gizliyse 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'nizin kullanıcıların şifre girip cihaza erişmesine izin vermek için birçok farklı karakter sağlaması gerekir.