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 dokunmatik klavye veya ses girişi gibi alternatif giriş yöntemleri sunmasına olanak tanıyan genişletilebilir bir giriş yöntemi çerçevesi sağlar. IME'leri yükledikten sonra kullanıcı, sistem ayarlarından birini seçip tüm sistemde kullanabilir. Aynı anda yalnızca bir IME etkinleştirilebilir.

Android sistemine IME eklemek için InputMethodService sınıfını genişleten bir Android uygulaması oluşturun. Ayrıca genellikle IME hizmetine seçenekleri ileten bir "ayarlar" etkinliği oluşturursunuz. Ayrıca, sistem ayarlarının bir parçası olarak gösterilen bir ayar 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 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.
Şekil 1. 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.

IME bileşenlerini manifest dosyasında bildirme

Android sisteminde IME, özel bir IME hizmeti içeren bir Android uygulamasıdır. Uygulamanın manifest dosyası hizmeti beyan etmeli, gerekli izinleri istemeli, action.view.InputMethod işlemiyle eşleşen bir intent filtresi sağlamalı ve IME'nin özelliklerini tanımlayan meta veriler sağlamalı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'te bir IME hizmeti tanımlanmaktadır. 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 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>

Sonraki snippet, IME için ayarlar etkinliğini bildirir. Bu etkinliğin IME uygulaması için ana giriş noktası olduğunu gösteren ACTION_MAIN için bir intent filtresi vardır:

<!-- 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 ayarlarına doğrudan kullanıcı arayüzünden de erişebilirsiniz.

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ı, InputMethodService sınıfını genişleten bir hizmet bileşenidir. 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ğlamak, kullanıcı girişini işlemek ve metni odaklanılan alana iletmek için geri çağırmalara sahiptir. 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 uygulamanın çoğunu sağlar.

Aşağıdaki sınıflar da önemlidir:

BaseInputConnection
InputMethod ile girişini alan uygulama arasındaki iletişim kanalını tanımlar. İmlecin etrafındaki metni okumak, metin kutusuna metin girmek ve uygulamaya ham tuş etkinlikleri göndermek için bu API'yi kullanırsınız. Uygulamalar, temel arayüzü InputConnection 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, bir XML dosyasında tanımlayabileceğiniz bir Keyboard örneğiyle belirtilir.

Giriş yöntemi kullanıcı arayüzünü tasarlama

IME'nin iki ana 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ö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 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 öğesini oluşturan KeyboardView özel uygulamasının bir örneğidir.

Adaylar görünümü

Adaylar görünümü, IME'nin kullanıcının seçebileceği olası kelime düzeltmelerini veya önerilerini gösterdiğ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() yöntemini çağırır. Bu yöntemi uygularken kelime önerilerini gösteren bir düzen döndürün veya hiçbir şey göstermek istemiyorsanız null döndürün. Boş yanıt, varsayılan davranıştır. Bu nedenle, öneri sunmuyorsanı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 destekleme

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 ilgili 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ü ayarlamanıza olanak tanır. Yeni bir IME uygularken 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 amacıyla 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'de metin girişini gösteren bir resim
Şekil 2. Latin IME metin girişi.

Latin IME'nin Android platformu için sağladığı arayüzü burada görebilirsiniz. Sayısal giriş:

Latin IME'de sayısal girişi gösteren bir resim
Şekil 3. 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 EditorInfo nesnesi ileterek onStartInputView() yöntemini ç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ı için bit kalıpları içeren bir int değeridir. Metin alanının giriş türünü test etmek için sabit 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 de dahil olmak üzere çeşitli değerlerden birine sahip olabilir:

TYPE_CLASS_NUMBER
Sayı girmek için kullanılan metin alanı. Şekil 3'te gösterildiği gibi, Latin IME bu tür alanlar için bir 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 metin alanı.
TYPE_CLASS_TEXT
Desteklenen karakterleri girmek için kullanılan 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 kullanılan bir TYPE_CLASS_TEXT varyantı. Giriş yöntemi, gerçek metin yerine semboller gösterir.
TYPE_TEXT_VARIATION_URI
Web URL'lerini ve diğer Tek Tip Kaynak Tanımlayıcıları (URI'ler) girmek için kullanılan bir TYPE_CLASS_TEXT varyantı.
TYPE_TEXT_FLAG_AUTO_COMPLETE
Uygulamanın bir sözlük, arama 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 ile ilgili referans belgelerinde 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() işlevini çağırın.

İmlecin etrafındaki metni düzenleme

Mevcut metni düzenlerken BaseInputConnection uygulamasında 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()
Mevcut imleç konumundan sonra istenen sayıda karakter içeren bir CharSequence döndürür.
deleteSurroundingText()
İmlecin geçerli konumundan önce ve sonra gelen belirtilen sayıda karakteri siler.
commitText()
Metin alanına bir CharSequence uygular 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);

Onaylamadan önce metin oluşturma desteği

IME'niz metin tahmininde bulunuyorsa veya bir glif ya da kelime oluşturmak için birden fazla adım gerektiriyorsa kullanıcı kelimeyi onaylayana kadar metin alanında ilerleme durumunu gösterebilir, ardından kısmi oluşturmayı tamamlanmış metinle değiştirebilirsiniz. Metni setComposingText() öğesine iletirken span ekleyerek metne özel bir işlem uygulayabilirsiniz.

Aşağıdaki snippet'te, ilerleme durumunun bir metin alanında nasıl gösterileceği açıklanmaktadır:

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 engelleme

Giriş yöntemi penceresi açıkça odaklanmasa bile donanım tuşu etkinliklerini ilk olarak alır ve bunları kullanabilir veya uygulamaya yönlendirebilir. Ö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 kaynaklanan iletişim kutularını kapatmak için geri tuşunu da yakalamak isteyebilirsiniz.

Donanım anahtarlarını yakalamak için onKeyDown() ve onKeyUp() yöntemlerini geçersiz kılın.

Kendiniz işlemek istemediğiniz tuşlar 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 edebilir:

  • Yerel ayar (ör. en_US veya fr_FR)
  • Ses, klavye veya el yazısı gibi bir giriş modu
  • IME'ye özgü diğer giriş stilleri, formlar veya özellikler (ör. 10 tuşlu veya QWERTY klavye düzenleri)

Mod, "klavye" veya "ses" gibi herhangi bir metin olabilir. Bir alt tür, bunların bir kombinasyonunu da gösterebilir.

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'nin belirli bir alt türünü getirmesine de olanak tanır. IME oluştururken alt tür özelliğini kullanın. Bu özellik, kullanıcının farklı IME dillerini ve modlarını tanımlayıp bunlar arasında geçiş yapmasına yardımcı olur.

Alt türleri, giriş yönteminin XML kaynak dosyalarından birinde <subtype> öğesini kullanarak tanımlayın. 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 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 `%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 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" />

Sonraki snippet, IME'nin strings.xml dosyasının bir parçasıdır. Giriş yöntemi kullanıcı arayüzü tanımı tarafından alt türün etiketini ayarlamak için 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 ayarla eşleşmesine neden olur. Örneğin, İngilizce yerel ayarlarında görünen ad "English (United States)" şeklindedir.

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 değerlendirilir. Kullanıcı, bildirim çubuğundan veya Ayarlar uygulamasından aşağıdaki resimde 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
Şekil 4. 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:

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

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ına olanak tanıyabilirsiniz. Bu, klavyenin kullanılabilirliğini artırır ve kullanıcıya kolaylık sağlar. 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 tanımlayın. 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 "true" değerini döndürürse bir düğme tuşu gösterin.
  4. Kullanıcı düğme tuşuna dokunduğunda switchToNextInputMethod() yöntemini çağırın ve false 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 ele almasını 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 şunlardır:

  • Kullanıcıların seçenekleri doğrudan IME'nin kullanıcı arayüzünden ayarlayabilmesini 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çebilmelerini 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ö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 alma
  • Giriş yöntemi penceresi gizlendikten hemen sonra büyük bellek ayırmaları serbest bırakılır. Böylece uygulamaların çalışması için yeterli bellek sağlanır. IME birkaç saniyeliğine gizlenirse kaynakları serbest bırakmak için gecikmeli bir 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.