Giriş yöntemi oluşturma

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'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:

IME'nin yaşam döngüsünü gösteren bir resim.
1.şekil IME'nin yaşam döngüsü.

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şletmelidir InputConnection.
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ğiniz Keyboard ö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:

Bir Latin IME&#39;sinde metin girişini gösteren resim
Şekil 2. Latin IME metin girişi.

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

Latin IME&#39;de sayısal giriş gösteren bir resim
3.şekil Latin IME sayısal girişi.

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:

Diller ve giriş Sistem menüsünü gösteren bir resim
4.şekil Diller ve giriş sistem menüsü.

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:

Dil seçim menüsünü gösteren bir resim
Şekil 5. Diller sistem menüsü

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:

  1. 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">
  2. shouldOfferSwitchingToNextInputMethod() yöntemini çağırın.
  3. Yöntem doğru değerini döndürürse bir geçiş anahtarı gösterin.
  4. 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.