Giriş yöntemi düzenleyicisi (IME), kullanıcıların metin girmesine olanak tanıyan bir kullanıcı denetimidir. Android, uygulamaların kullanıcılara alternatif giriş yöntemleri sunmasını sağlayan genişletilebilir giriş yöntemi çerçevesi ekran klavyeleri veya konuşma girişi gibi. IME'leri yükledikten sonra kullanıcı ve bunu tüm sistemde kullanabilirsiniz. Aynı anda yalnızca bir IME etkinleştirilebilir.
Android sistemine IME eklemek için şu sınıfa sahip bir Android uygulaması oluşturun:
uzatır
InputMethodService
Buna ek olarak, genellikle bir "ayarlar" iME hizmetine seçenekler ileten etkinliktir. Siz
sistem ayarlarının parçası olarak görüntülenen bir ayarlar kullanıcı arayüzü de tanımlayabilir.
Bu sayfada aşağıdaki konular ele alınmaktadır:
- IME yaşam döngüsü
- Uygulama manifest dosyasında IME bileşenlerini bildirme
- IME API'si
- IME kullanıcı arayüzü tasarlama
- IME'den uygulamaya kısa mesaj gönderme
- IME alt türleriyle çalışma
- IME ile ilgili dikkat edilmesi gereken diğer noktalar
Daha önce IME'lerle çalışmadıysanız tanıtım makalesini okuyun. Ekrandaki Giriş Yöntemleri tıklayın.
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, kullanıcı arayüzünün bu yaşam döngüsünü izler.
Manifest'te IME bileşenlerini bildir
Android sisteminde IME, özel bir IME hizmeti içeren Android uygulamasıdır. İlgili içeriği oluşturmak için kullanılan
uygulamasının manifest dosyasında hizmeti beyan etmeli, gerekli izinleri istemeli,
action.view.InputMethod
işlemiyle eşleşen ve meta veriler sağlayan intent filtresi
IME'nin özelliklerini tanımlayan bir ifadedir. Ayrıca,
IME davranışını değiştirmesi için bir "ayarlar" başlatılması veya
Sistem Ayarları.
Aşağıdaki snippet bir IME hizmetini tanımlar. İzin istiyor
BIND_INPUT_METHOD
.
hizmetin IME'yi sisteme bağlamasını sağlamak için, işlemle eşleşen bir intent filtresi oluşturur.
android.view.InputMethod
değerini alır ve IME'nin meta verilerini 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 ayar etkinliğini açıklar. Şunun için bir intent filtresine sahiptir:
ACTION_MAIN
bu etkinliğin IME uygulaması için 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, doğrudan IME'nin kullanıcı arayüzünden IME'nin ayarlarına erişim sağlayabilirsiniz.
Giriş yöntemi API'si
IME'lere özel sınıflar
android.inputmethodservice
.
ve
android.view.inputmethod
pakettir. KeyEvent
sınıfı
çok önemlidir.
Bir IME'nin merkezi bölümü bir hizmet bileşenidir.
InputMethodService
Bu, normal hizmet yaşam döngüsünü uygulamanın yanı sıra
class'ta IME'nizin kullanıcı arayüzünü sağlamak, kullanıcı girişini yönetmek ve
bir alandır. Varsayılan olarak InputMethodService
sınıfı,
IME'nin durumunu ve görünürlüğünü yönetmek ve mevcut müşteri temsilcisiyle iletişim kurmak için
giriş alanına ekleyebilirsiniz.
Aşağıdaki sınıflar da önemlidir:
BaseInputConnection
- .
Bir ağdan iletişim kanalını tanımlar
InputMethod
alan uygulamaya geri dönmesini sağlar. Arka plandaki yazıları okumak için imleç, metin kutusuna metin kaydetme ve ham önemli etkinlikleri uygulamaya gönderme. Uygulamalar, temel arayüzü uygulamak yerine bu sınıfı genişletmelidirInputConnection
KeyboardView
- .
View
uzantısı bir klavye oluşturur ve kullanıcı girişi etkinliklerine yanıt verir. Klavye düzeni bir şunun örneği:Keyboard
, (XML dosyasında tanımlayabileceğiniz)
Giriş yöntemi kullanıcı arayüzünü tasarlama
IME'nin iki ana görsel öğesi vardır: input görünümü ve candidates görünümünü sunar. Yalnızca işletmenizle alakalı öğeleri uygulamanız gerekir. giriş yöntemini kullanabilirsiniz.
Giriş görünümü
Giriş görünümü, kullanıcının tuşa tıklama, el yazısı veya
hareketler. IME ilk kez görüntülendiğinde sistem
onCreateInputView()
.
geri arama. Bu yöntemi uygularken IME'de görüntülenmesini istediğiniz düzeni oluşturun
pencereye alın ve düzeni sisteme geri döndürün. Aşağıdaki snippet, Google Etiket Yöneticisi'ni kullanarak
onCreateInputView()
yöntemi:
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
özel bir uygulamanın bir örneğidir:
Keyboard
oluşturan KeyboardView
.
Aday görünümü
Adaylar görünümü, IME'nin olası kelime düzeltmelerini veya önerileri gösterdiği kullanıcı arayüzüdür
kullanıcının seçmesi için bir fırsattır. IME yaşam döngüsünde sistem,
onCreateCandidatesView()
.
hazır olduğunda adaylar görünümünü Bu yöntemi uygulamanızda
kelime önerileri gösteren bir düzen seçin veya herhangi bir şey göstermek istemiyorsanız null değerini döndürün. Boş
yanıtı varsayılan davranıştır; bu nedenle
öneriler.
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ıyla ilgili dikkate alınması gereken bazı noktalar açıklanmaktadır.
Birden fazla ekran boyutunu yönetme
IME'nizin kullanıcı arayüzünün, farklı ekran boyutlarına göre ölçeklendirilebilmesi ve her iki yatay ekranı işleyebilmesi gerekir. bir arada kullanabilirsiniz. Tam ekran olmayan IME modunda, uygulamanın metin alanını ve içerikle ilişkili bağlamı göstererek ekranın yarısından fazlasını IME'yi seçin. Tam ekran IME modunda bu bir sorun değildir.
Farklı giriş türlerini işleyin
Android metin alanları serbest biçimli metin, sayı, URL vb. gibi belirli giriş türlerini ayarlamanıza olanak tanır. ve arama dizeleri dahil edilir. Yeni bir IME uyguladığınızda her bir IME'nin giriş türünü alanına girin ve bunun için uygun arayüzü sağlayın. Ancak, IME'nizi kullanıcının giriş türü için geçerli metin girip girmediğini kontrol eder. Bu, bir uygulamadır.
Örneğin, Latince IME'nin Android platformu metni için sağladığı arayüz aşağıda verilmiştir: giriş:
Burada da, Latince IME'nin, Android platformu için sağladığı sayısal giriş:
Bir giriş alanına odaklanıldığında ve IME'niz başladığında sistem
onStartInputView()
,
bir
EditorInfo
nesne
giriş türü ve metin alanının diğer özellikleriyle ilgili ayrıntıları içeren bir sayfadır. Bu nesnede,
"the"
inputType
.
alanı, metin alanının giriş türünü içerir.
inputType
alanı, çeşitli öğeler için bit kalıpları içeren bir int
giriş türü ayarlarına gidin. Bunu metin alanının giriş türüne göre test etmek için, sabit değer ile maskeleyin
TYPE_MASK_CLASS
,
aşağıdaki gibidir:
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
- Rakamları girmek için kullanılan bir metin alanı. Şekil 3'te gösterildiği gibi, Latince IME'de bir sayı tuşlarını kullanın.
TYPE_CLASS_DATETIME
- Tarih ve saat girmek için bir metin alanı.
TYPE_CLASS_PHONE
- Telefon numaralarını girmek için bir metin alanı.
TYPE_CLASS_TEXT
- Desteklenen karakterleri girebileceğiniz bir metin alanı.
Bu sabit değerler, kullanılan referans belgelerinde daha ayrıntılı olarak açıklanmıştır:
InputType
inputType
alanı, metin alanının varyantını belirten başka bitler içerebilir
Örneğin:
TYPE_TEXT_VARIATION_PASSWORD
- Şifre girmek için
TYPE_CLASS_TEXT
varyantı. Giriş yöntemi, dingbat'lar oluşturabilirsiniz. TYPE_TEXT_VARIATION_URI
- Web URL'lerini ve diğer Tekdüzen Kaynakları girmek için
TYPE_CLASS_TEXT
varyantı Tanımlayıcılar (URI). TYPE_TEXT_FLAG_AUTO_COMPLETE
- Uygulamanın istediği metni girmek için
TYPE_CLASS_TEXT
değişkeni Bir sözlükten, aramadan veya başka bir özellikten otomatik olarak tamamlar.
Bu varyantları test ederken inputType
öğesini uygun sabitle maskeleyin. İlgili içeriği oluşturmak için kullanılan
kullanılabilir maske sabit değerleri, InputType
referans belgelerinde listelenmiştir.
Uygulamaya kısa mesaj gönder
Kullanıcı IME'nizle metin girerken, IME'nizi tek tek göndererek uygulamaya metin gönderebilirsiniz
veya uygulamanın metin alanında imlecin etrafındaki metni düzenleyerek önemli etkinlikleri sağlayabilirsiniz. Her iki durumda da,
Metni iletmek için InputConnection
örneğini kullanın. Bu örneği almak için şunu arayın:
InputMethodService.getCurrentInputConnection()
İmlecin etrafındaki metni düzenleme
Mevcut metinleri düzenlerken,
BaseInputConnection
şunlardır:
-
getTextBeforeCursor()
CharSequence
döndürür , geçerli imleç konumundan önceki istenen karakter sayısını içerir.-
getTextAfterCursor()
- Aşağıdakilerden sonra istenen karakterlerin sayısını içeren bir
CharSequence
döndürür: imlecin bulunduğu konuma getirin. -
deleteSurroundingText()
- Geçerli imleç konumundan önce ve sonra belirtilen sayıda karakteri siler.
-
commitText()
- Metin alanına bir
CharSequence
kaydeder ve yeni bir imleç konumu ayarlar.
Örneğin, aşağıdaki snippet'te "Hello!" ifadesini içeren bir imleç:
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 glif ya da kelime oluşturmak için birden fazla adım gerektiriyorsa
devam edin. Kullanıcı kelimeyi kaydedene kadar, yerine kısmi
kompozisyonu oluşturun. Örneğin,
span
setComposingText()
.
Aşağıdaki snippet'te, bir metin alanında ilerleme durumunun 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 etkinlikleri engelleme
Giriş yöntemi penceresinde belirgin bir odağı olmasa da donanımla ilgili önemli etkinlikler alır önce tüketebilir veya uygulamaya yönlendirebilir. Örneğin, ekip arkadaşlarınızın kullanıcı arayüzünüz içinde gezinmek için yön tuşlarını kullanın. Giriş yönteminden kaynaklanan iletişim kutularını kapatmak için geri tuşunu da yakalamanız önerilir. penceresini kapatın.
Donanım anahtarlarına müdahale etmek için
onKeyDown()
.
ve
onKeyUp()
.
Kendiniz kullanmak istemediğiniz anahtarlar için super()
yöntemini çağırın.
IME alt türü oluşturma
Alt türler, IME'nin birden fazla giriş modunu ve IME tarafından desteklenen dilleri göstermesine olanak tanır. Alt tür aşağıdakileri temsil eder:
- en_US veya fr_FR gibi bir yerel ayar
- Ses, klavye veya el yazısı gibi bir giriş modu
- 10 tuşlu veya QWERTY gibi IME'ye özgü diğer giriş stilleri, formları veya özellikleri klavye düzenleri
Mod, "klavye" gibi herhangi bir metin olabilir veya "ses"le başlayın. Bir alt tür, bir kombinasyonun da gösterilmesini sağlayabilir sayabiliriz.
Alt tür bilgileri, bildirim çubuğundan ulaşılabilen bir IME değiştirici iletişim kutusu için kullanılır ve IME ayarları için geçerlidir. Bu bilgiler, çerçevenin bir IME'nin belirli bir alt türünü ortaya çıkarmasına da olanak tanır. doğrudan ekleyebilirsiniz. IME oluşturduğunuzda, alt tür olanağını kullanın. Çünkü bu, kullanıcının kimliğini belirleyip farklı IME dilleri ve modları arasında geçiş yapabilirsiniz.
Aşağıdaki kodu kullanarak giriş yönteminin XML kaynak dosyalarından birinde alt türleri tanımlayın:
<subtype>
öğesi. Aşağıdaki kod snippet'i iki alt türü olan bir IME'yi tanımlar:
ABD İngilizcesi yerel ayarı için klavye alt türü ve Fransızca için başka bir klavye alt türü
Fransa için yerel ayar:
<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" işlevini kullanarak alt türün yerel ayar etiketiyle aynıdır. Bu, sonraki iki kod snippet'inde gösterilmektedir. İlgili içeriği oluşturmak için kullanılan ilk 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. Dize kaynağı
label_subtype_generic
(Bu,
alt türün etiketi 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 ayarla eşleşmesine neden olur. Örneğin, İngilizce yerel ayar, görünen ad "İngilizce (ABD)"dir.
Bildirim çubuğundan IME alt türlerini seçin
Android sistemi, tüm IME'ler tarafından gösterilen tüm alt türleri yönetir. IME alt türleri, Ait olduğu IME'yi gösterir. Kullanıcı, bildirim çubuğundan veya Ayarlar uygulamasından bir aşağıda gösterildiği gibi kullanılabilir IME alt türlerinin yer aldığı menü:
Sistem Ayarları'ndan IME alt türlerini seçin
Kullanıcı, alt türlerin nasıl kullanıldığını da Dil ve giriş ayarları paneli girin:
IME alt türleri arasında geçiş yapma
Örneğin yerküre şeklinde dil simgesine dokunun. Bu, klavyenin kullanılabilirliğini artırır ve kullanışlı olur temsil eder. Bu geçişi etkinleştirmek için aşağıdaki adımları uygulayın:
- Giriş yönteminin XML'inde
supportsSwitchingToNextInputMethod = "true"
öğesini bildir kaynak dosyalar. 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">
. - Şunu çağırın:
shouldOfferSwitchingToNextInputMethod()
. yöntemidir. - Yöntem true değerini döndürürse bir geçiş anahtarı görüntüleyin.
- Kullanıcı geçiş tuşuna dokunduğunda şunu ara:
switchToNextInputMethod()
, iletebilir. False (yanlış) değeri, sisteme ne olursa olsun tüm alt türleri eşit şekilde Ait olduğu IME'yi gösterebilirsiniz. Doğru değerini belirlemek için sistemin görebilirsiniz.
IME ile ilgili dikkat edilmesi gereken genel noktalar
IME'nizi uygularken göz önünde bulundurmanız gereken diğer noktalar şunlardır:
- Kullanıcılara, seçenekleri doğrudan IME'nin kullanıcı arayüzünden ayarlama olanağı sunun.
- Kullanıcıların, giriş yönteminin kullanıcı arayüzünden doğrudan farklı bir IME'ye geçiş yapması için bir yol sağlayın. çünkü cihazda birden fazla IME yüklü olabilir.
- IME'nin kullanıcı arayüzünü hızlı bir şekilde açın. Büyük kaynakları istediğiniz zaman önceden yükleyerek veya yükleyerek bir metin alanına dokunur dokunmaz IME'yi görebilir. Daha sonrası için kaynakları ve görünümleri önbelleğe alın çağrılarına karşılık gelir.
- Büyük bellek ayırmalarını giriş yöntemi penceresi gizlendikten hemen sonra serbest bırakın. yeterli belleğe sahip olduğundan emin olmanız gerekir. Kaynakları serbest bırakmak için geciken bir mesaj kullanın birkaç saniye boyunca gizlenecek.
- Kullanıcıların dil veya yerel ayar için mümkün olduğunca fazla karakter girebildiğinden emin olun IME ile ilişkilendirilmiştir. Kullanıcılar, şifrelerinde veya kullanıcı adlarında noktalama işareti kullanıyor olabilir. Bu nedenle, IME'niz kullanıcıların şifre girmelerine ve web'e erişmelerine izin vermek için olanak tanır.