Giriş yöntemi oluşturma

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

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

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 bir Keyboard ö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:

Latince IME&#39;de metin girişini gösteren bir resim
Şekil 2. Latince IME metin girişi.

Burada Latin IME'sinin, Android platformu sayısal girişi için sağladığı arayüz şöyledir:

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

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:

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

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:

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

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:

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