Giriş yöntemi oluşturma

Giriş yöntemi düzenleyici (IME), kullanıcıların metin girmesine olanak tanıyan bir kullanıcı denetimidir. Android, uygulamaların kullanıcılara ekran klavyeleri 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. 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 Ayrıca, 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'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:

Bir 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ü 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 Android uygulamasıdır. Uygulamanın manifest dosyasında hizmet beyan edilmeli, gerekli izinler istenmeli, action.view.InputMethod işlemiyle eşleşen bir intent filtresi sağlanmalı ve IME'nin özelliklerini tanımlayan meta veriler sağlanmalıdır. 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 öğesi içerir 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. Bu etkinlik, ACTION_MAIN için bu etkinliğin IME uygulamasının ana giriş noktası olduğunu belirten 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>

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 paketlerini ekleyebilirsiniz. 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, 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 InputMethod kaynağından girişini alan uygulamaya kadar olan iletişim kanalını tanımlar. İmlecin etrafındaki metni okumak, metni metin kutusuna kaydetmek ve uygulamaya ham önemli etkinlikler göndermek için kullanılır. Uygulamalar, temel arayüzü uygulamak yerine bu sınıfı genişletmelidir InputConnection
KeyboardView
. View uzantısı bir klavye oluşturur ve kullanıcı girişi 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 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() callback'i ç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, 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, KeyboardView için Keyboard öğesini oluşturan özel bir uygulama örneğidir.

Adaylar 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, adayların görünümünü göstermeye hazır olduğunda onCreateCandidatesView() metodunu ç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 öneriler.

Kullanıcı arayüzü tasarımında dikkat edilmesi gereken noktalar

Bu bölümde, IME'lerle ilgili bazı kullanıcı arayüzü tasarımı hususları açıklanmaktadır.

Birden fazla ekran boyutunu yönetme

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 ilişkili tüm bağlamı göstermesi için yeterli alan bırakın. Böylece, ekranın en fazla yarısı IME tarafından kaplanır. Tam ekran IME modunda bu sorun yaşanmaz.

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, IME'nizi kullanıcının giriş türü için geçerli metin girip girmediğini kontrol eder. Bu, metin alanının sahibi olan uygulamanın sorumluluğundadır.

Örneğin, Latince IME'nin Android platformu metni için sağladığı arayüz aşağıda verilmiştir: giriş:

Latince IME üzerinde metin girişini gösteren resim
Şekil 2. Latince IME metin girişi.

Latin IME'nin Android platformu için sayısal giriş sağlayan arayüzü aşağıda verilmiştir:

Latin IME&#39;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 özellikleriyle ilgili ayrıntıları içeren bir EditorInfo nesnesi göndererek onStartInputView() işlevini çağırır. Bu nesnede, "the" inputType. alanı, metin alanının giriş türünü içerir.

inputType alanı, çeşitli giriş türü ayarlarının bit kalıplarını içeren bir int'tır. Metin alanının giriş türü için test etmek üzere sabit TYPE_MASK_CLASS ile maskeleyebilirsiniz. Ö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 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 tüm karakterleri girmek için bir metin alanı.

Bu sabitler, InputType için referans dokümanlarında daha ayrıntılı olarak açıklanmıştır.

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çinTYPE_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. Kullanılabilir maske sabitleri, InputType için referans dokümanlarında listelenir.

Uygulamaya metin gönderme

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 InputMethodService.getCurrentInputConnection() numaralı telefonu arayın.

İmlecin etrafındaki metni düzenleme

Mevcut metinleri düzenlerken BaseInputConnection'te kullanabileceğiniz bazı faydalı yöntemler şunlardır:

getTextBeforeCursor()
Mevcut imleç konumundan önce istenen karakterlerin sayısını içeren bir CharSequence döndürür.
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ım anahtar etkinliklerini durdurma

Giriş yöntemi penceresi açıkça odaklanmamış olsa bile donanım tuş etkinliklerini ilk olarak alır ve bunları kullanabilir ya da uygulamaya iletebilir. Ö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 gelen tüm iletişim kutularını kapatmak için geri tuşunu da tuş tuzağından geçirebilirsiniz.

Donanım anahtarlarına müdahale etmek için onKeyDown(). ve onKeyUp().

Kendi başınıza yönetmek 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 klavye düzenleri gibi IME'ye özgü diğer giriş stilleri, formları veya özellikleri

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

Alt tür bilgileri, bildirim çubuğundan kullanılabilen IME değiştirici iletişim kutusu ve IME ayarları için kullanılır. Bu bilgiler, çerçevenin bir IME'nin belirli bir alt türünü ortaya çıkarmasına da olanak tanır. 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'inde, iki alt türü olan bir IME tanımlanmaktadır: ABD İngilizcesi yerel ayarı için bir klavye alt türü ve Fransa'nın 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ı alt tür etiketini almak üzere "%s" kullanın. Bu durum, 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 ayarıyla 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 sunulan 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, aşağıdaki şekilde gösterildiği gibi kullanılabilir IME alt türlerinin bulunduğu bir menüye gidebilir:

Diller ve giriş sistem menüsü
Şekil 4. Diller ve giriş sistem menüsüne gidin.

Sistem ayarlarından IME alt türlerini seçme

Kullanıcı, alt türlerin nasıl kullanıldığını da Dil ve giriş ayarları paneli girin:

Dil seçimi 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ş anahtarı sağlayarak kullanıcıların IME alt türleri arasında kolayca geçiş yapmasına izin verebilirsiniz. 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:

  1. Giriş yönteminin XML kaynak dosyalarında supportsSwitchingToNextInputMethod = "true" öğesini tanımlayın. Beyanınız aşağıdaki kod snippet'ine benzer şekilde görünmelidir:
    <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 geçiş anahtarı gösterin.
  4. 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 oldukları IME'yi seçebilme. Doğru değerini belirtmek, sistemin mevcut IME'deki alt türleri taramasını gerektirir.

Genel IME ile ilgili dikkat edilmesi gereken 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.
  • 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çmesini sağlayın.
  • 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.
  • Uygulamaların çalışabilmesi için giriş yöntemi penceresi gizlendikten hemen sonra büyük bellek ayırma işlemlerini serbest bırakın. IME birkaç saniye boyunca gizliyse 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, ş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.