Giriş yöntemi düzenleyicisi (IME), kullanıcıların metin girmelerine olanak tanıyan bir kullanıcı kontrolüdür. Android, uygulamaların kullanıcılara dokunmatik klavye veya konuşma girişi gibi alternatif giriş yöntemleri sunmasını sağlayan genişletilebilir bir giriş yöntemi çerçevesi sağlar. IME'leri yükledikten sonra kullanıcı sistem ayarlarından bir tane seçebilir ve bu IME'yi tüm sistemde kullanabilir. Aynı anda yalnızca bir IME etkinleştirilebilir.
Android sistemine bir IME eklemek için InputMethodService
kapsamını genişleten bir sınıf içeren Android uygulaması oluşturun.
Buna ek olarak, genellikle seçenekleri IME hizmetine ileten bir "ayarlar" etkinliği oluşturursunuz. Sistem ayarlarının bir parçası olarak gösterilecek 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 manifest dosyasında IME bileşenlerini beyan etme
- IME API'si
- IME kullanıcı arayüzü tasarlama
- IME'den bir uygulamaya metin gönderme
- IME alt türleriyle çalışma
- IME ile ilgili dikkate alınması gereken diğer noktalar
IME'lerle çalışmadıysanız önce Ekranda Giriş Yöntemleri başlıklı tanıtım 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ü takip eden bir IME ile ilişkilendirilmiş kullanıcı arayüzünün ve kodun nasıl uygulanacağı açıklanmaktadır.
Manifest'te IME bileşenlerini bildirme
Android sisteminde IME, özel bir IME hizmeti içeren bir Android uygulamasıdır. Uygulamanın manifest dosyası hizmeti tanımlamalı, gerekli izinleri istemeli, action.view.InputMethod
işlemiyle eşleşen bir amaç filtresi sağlamalı ve IME'nin özelliklerini tanımlayan meta veriler sağlamalıdır. Buna ek olarak, kullanıcının IME'nin davranışını değiştirmesine olanak tanıyan bir ayar arayüzü sağlamak için Sistem Ayarları'ndan başlatılabilen bir "ayarlar" etkinliği tanımlayabilirsiniz.
Aşağıdaki snippet bir IME hizmetini tanımlar. Hizmetin IME'yi sisteme bağlamasına izin vermek için BIND_INPUT_METHOD
iznini ister, android.view.InputMethod
işlemiyle eşleşen bir amaç 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>
Sonraki snippet, IME'nin ayar etkinliğini tanımlar. Bu etkinlik, IME uygulaması için ana giriş noktası olduğunu belirten ACTION_MAIN
için 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>
IME'nin ayarlarına doğrudan kullanıcı arayüzünden de erişim sağlayabilirsiniz.
Giriş yöntemi API'si
IME'lere özel sınıflar, android.inputmethodservice
ve android.view.inputmethod
paketlerinde bulunmaktadır. KeyEvent
sınıfı, klavye karakterlerini işlemek için önemlidir.
IME'nin orta kısmı bir hizmet bileşenidir. Bu da InputMethodService
ile biten bir sınıftır. Bu sınıfta, normal hizmet yaşam döngüsünün uygulamaya ek olarak, IME'nizin kullanıcı arayüzünü sağlamak, kullanıcı girişlerini yönetmek ve metni odaklanılan alana göndermek için geri çağırma işlemleri yapılır. 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 gereken en fazla uygulamayı sağlar.
Aşağıdaki sınıflar da önemlidir:
BaseInputConnection
-
InputMethod
ile girişini alan uygulamaya giden iletişim kanalını tanımlar. İmlecin etrafındaki metni okumak, metin kutusuna metin kaydetmek ve ham önemli etkinlikleri uygulamaya göndermek için bu API'yi kullanırsınız. Uygulamalar,InputConnection
temel arayüzünü uygulamak yerine bu sınıfı genişletmelidir. KeyboardView
- Klavye oluşturan ve kullanıcı giriş etkinliklerine yanıt veren bir
View
uzantısı. Klavye düzeni, XML dosyasında tanımlayabileceğiniz birKeyboard
örneğiyle belirtilir.
Giriş yöntemi kullanıcı arayüzünü tasarlama
IME'de iki temel görsel öğe vardır: giriş görünümü ve aday 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ş tıklaması, el yazısı veya hareket biçiminde metin girdiği kullanıcı arayüzüdür. IME ilk kez görüntülendiğinde sistem onCreateInputView()
geri çağırma işlemini çağırır. Bu yöntemi uygularken, IME penceresinde görüntülemek istediğiniz düzeni oluşturun ve bu 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
, Keyboard
oluşturan özel bir KeyboardView
uygulamasının örneğidir.
Aday görünümü
Adaylar görünümü, IME'nin kullanıcının seçebileceği olası kelime düzeltmelerini veya önerileri görüntülediği kullanıcı arayüzüdür. IME yaşam döngüsünde sistem, adaylar görünümünü göstermeye hazır olduğunda onCreateCandidatesView()
çağrısı yapar. Bu yöntemi uygulamanızda, kelime önerileri gösteren bir düzen veya hiçbir şey göstermek istemiyorsanız null değerini döndürün. Boş yanıt, varsayılan davranıştır. Dolayısıyla, öneride bulunmazsanız bunu uygulamanız gerekmez.
Kullanıcı arayüzü tasarımında 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şleyin
IME'nizin kullanıcı arayüzünün farklı ekran boyutları için ölçeklenebilmesi ve hem yatay hem de dikey yönleri işleyebilmesi gerekir. 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ı kaplayamaz. 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 uygularken 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ğudur.
Örneğin, Android platformu metin girişi için Latince IME'nin sağladığı arayüz şöyledir:
Burada Latin IME'sinin, Android platformu sayısal girişi için sağladığı arayüz şöyledir:
Bir giriş alanı odağı aldığında ve IME'niz başladığında sistem onStartInputView()
yöntemini çağırarak giriş türü ve metin alanının diğer özellikleri hakkında ayrıntıları içeren bir EditorInfo
nesnesini iletir. Bu nesnedeki inputType
alanı, metin alanının giriş türünü içerir.
inputType
alanı, çeşitli giriş türü ayarları için bit kalıpları içeren bir int
alanıdır. Metin alanının giriş türünü test etmek için sabit değeri TYPE_MASK_CLASS
ile maskeleyin. Örneğin:
Kotlin
inputType and InputType.TYPE_MASK_CLASS
Java
inputType & InputType.TYPE_MASK_CLASS
Giriş türü bit kalıbı, aşağıdakiler dahil çeşitli değerlerden birine sahip olabilir:
TYPE_CLASS_NUMBER
- Sayı girmek için kullanılan bir metin alanı. Şekil 3'te gösterildiği gibi Latin IME'si bu tür alanlar için bir sayı tuş takımı görüntüler.
TYPE_CLASS_DATETIME
- Tarih ve saat girmek için kullanılan bir metin alanı.
TYPE_CLASS_PHONE
- Telefon numaralarını girmek için kullanılan bir metin alanı.
TYPE_CLASS_TEXT
- Desteklenen karakterleri girebileceğiniz bir metin alanı.
Bu sabit değerler, InputType
referans dokümanlarında daha ayrıntılı olarak açıklanmıştır.
inputType
alanı, metin alanı türünün bir varyantını belirten başka bitler içerebilir. Örneğin:
TYPE_TEXT_VARIATION_PASSWORD
- Şifreleri girmek için kullanılan bir
TYPE_CLASS_TEXT
varyantı. Giriş yöntemi, gerçek metin yerine dingbat'ları görüntüler. TYPE_TEXT_VARIATION_URI
- Web URL'leri ve diğer Tekdüzen Kaynak Tanımlayıcıları (URI'lar) girmek için kullanılan bir
TYPE_CLASS_TEXT
varyantı. TYPE_TEXT_FLAG_AUTO_COMPLETE
- Uygulamanın bir sözlükten, aramadan veya başka bir olanaktan otomatik olarak tamamladığı metni girmek için kullanılan bir
TYPE_CLASS_TEXT
varyantı.
Bu varyantları test ederken inputType
değerini uygun sabit değerle maskeleyin. Kullanılabilir maske sabitleri, InputType
referans dokümanlarında listelenmiştir.
Uygulamaya kısa mesaj gönder
Kullanıcı IME'nizle metin girerken ayrı ayrı tuş etkinlikleri göndererek veya uygulamanın metin alanında imlecin etrafındaki metni düzenleyerek uygulamaya metin gönderebilirsiniz. Her iki durumda da metni göndermek için bir InputConnection
örneği kullanın. Bu örneği almak için InputMethodService.getCurrentInputConnection()
numaralı telefonu arayın.
İmlecin etrafındaki metni düzenle
Mevcut metni düzenlerken BaseInputConnection
içinde kullanılabilen bazı faydalı yöntemler şunlardır:
-
getTextBeforeCursor()
- Mevcut imleç konumundan önce istenen karakter 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()
- İmleç konumundan önce ve sonra belirtilen sayıda karakteri siler.
-
commitText()
- Metin alanına bir
CharSequence
gönderir ve yeni bir imleç konumu ayarlar.
Örneğin, aşağıdaki snippet'te imlecin solundaki 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 yazma desteği
IME'niz metni tahmin ediyorsa veya bir karakteri ya da kelimeyi oluşturmak için birden çok adım gerektiriyorsa kullanıcı kelimeyi tamamlayana kadar ilerleme durumunu metin alanında gösterebilir ve ardından kısmi kompozisyonu tamamlanan metinle değiştirebilirsiniz. setComposingText()
adlı kullanıcıya iletirken bir aralık ekleyerek metne özel işlem yapabilirsiniz.
Aşağıdaki snippet'te, 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ımla ilgili önemli etkinliklere müdahale et
Giriş yöntemi penceresinin belirli bir odağı olmasa da ilk olarak donanımla ilgili önemli etkinlikleri alır ve bunları kullanabilir veya uygulamaya yönlendirebilir. Örneğin, beste sırasında aday seçimi için kullanıcı arayüzünüzde gezinmek üzere yön tuşlarını kullanmak isteyebilirsiniz. Ayrıca, giriş yöntemi penceresinden kaynaklanan iletişim kutularını kapatmak için geri tuşunu basılı tutabilirsiniz.
Donanım anahtarlarına müdahale etmek için onKeyDown()
ve onKeyUp()
değerlerini geçersiz kılın.
Kullanmanızı istemediğiniz anahtarlar için super()
yöntemini çağırın.
IME alt türü oluşturma
Alt türler, IME'nin bir IME tarafından desteklenen birden çok giriş modunu ve dili göstermesini sağlar. Bir alt tür, aşağıdakileri temsil edebilir:
- en_US veya fr_FR gibi bir yerel ayar
- Ses, klavye veya el yazısı gibi bir giriş modu
- IME'ye özgü diğer giriş stilleri, formlar veya özellikler (ör. 10 tuş veya Q klavye düzenleri)
Mod, "klavye" veya "ses" gibi herhangi bir metin olabilir. Bir alt tür, bunların bir kombinasyonunu da ortaya çıkarabilir.
Alt tür bilgileri, bildirim çubuğundan kullanılabilen IME değiştirici iletişim kutusu ve IME ayarları için kullanılır. Bilgiler, çerçevenin doğrudan bir IME'nin belirli bir alt türünü öne çıkarmasına da olanak tanır. IME oluştururken alt tür olanağını 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'i iki alt türe sahip bir IME tanımlar: ABD İngilizcesi yerel ayarı için bir klavye alt türü ve Fransa için 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 elde etmek üzere "%s" değerini kullanın. Bu, sonraki iki kod snippet'inde gösterilmiştir. İ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" />
Sıradaki 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 label_subtype_generic
dize kaynağı aşağıdaki şekilde tanımlanır:
<string name="label_subtype_generic">%s</string>
Bu ayar, alt türün görünen adının yerel ayarla eşleşmesine neden olur. Örneğin, herhangi bir İngilizce yerel ayarda görünen ad "İngilizce (ABD)"dir.
Bildirim çubuğundan IME alt türlerini seçin
Android sistemi, tüm IME'lerin gösterildiği tüm alt türleri yönetir. IME alt türleri, ait oldukları IME'nin modları olarak değerlendirilir. Kullanıcı, aşağıdaki şekilde gösterildiği gibi, bildirim çubuğundan veya Ayarlar uygulamasından kullanılabilir IME alt türleri menüsüne gidebilir:
Sistem Ayarları'ndan IME alt türlerini seçin
Kullanıcı, alt türlerin nasıl kullanıldığını sistem ayarlarındaki Dil ve giriş ayarları panelinden de kontrol edebilir:
IME alt türleri arasında geçiş yapma
Klavyedeki dünya ş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 kolaylık sağlar. Bu geçişi etkinleştirmek için aşağıdaki adımları uygulayın:
- Giriş yönteminin XML kaynak dosyalarında
supportsSwitchingToNextInputMethod = "true"
tanımlayın. Beyanınız, şu 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örüntüleyin.
- Kullanıcı değiştirme anahtarına dokunduğunda
switchToNextInputMethod()
yöntemini çağırarak "false" değerini iletin. false değeri, sisteme, ait oldukları IME'den bağımsız olarak tüm alt türlere eşit davranmasını söyler. True (doğru) değerini belirtmek, sistemin mevcut IME'de alt türler arasında geçiş yapmasını gerektirir.
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 ayarlaması için bir yol sağlayın.
- Cihaza birden fazla IME yüklenmiş olabileceğinden, kullanıcıların doğrudan giriş yöntemi kullanıcı arayüzünden farklı bir IME'ye geçişi için bir yol sağlayın.
- IME'nin kullanıcı arayüzünü hızlı bir şekilde açın. Büyük kaynakları isteğe bağlı olarak önceden yükleyin veya yükleyin. Böylece kullanıcılar, metin alanına dokunduklarında IME'yi hemen görebilir. Giriş yönteminin sonraki çağrıları için kaynakları ve görünümleri önbelleğe alın.
- Büyük bellek tahsislerini, giriş yöntemi penceresi gizlendikten hemen sonra serbest bırakın. Böylece uygulamaların yeterli bellek alanı olur. IME birkaç saniyeliğine gizlenirse kaynakları serbest bırakmak için geciken bir mesaj kullanın.
- Kullanıcıların, IME ile ilişkili dil veya yerel ayar için mümkün olduğunca fazla karakter girebildiğinden emin olun. Kullanıcılar şifrelerde veya kullanıcı adlarında noktalama işareti 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.